คำถามติดแท็ก c++11

ใช้แท็กนี้สำหรับรหัสที่ต้องคอมไพล์เป็น C ++ 11 (ไม่ใช้ฟีเจอร์ที่แนะนำใน C ++ 14 หรือใหม่กว่า)

4
เมื่อใดที่จะสร้างประเภทที่ไม่สามารถเคลื่อนย้ายได้ใน C ++ 11
ฉันแปลกใจที่สิ่งนี้ไม่ปรากฏในผลการค้นหาของฉันฉันคิดว่ามีคนถามเรื่องนี้มาก่อนเนื่องจากประโยชน์ของความหมายการย้ายใน C ++ 11: เมื่อใดที่ฉันต้อง (หรือเป็นความคิดที่ดีสำหรับฉัน) ทำให้คลาสไม่สามารถเคลื่อนย้ายได้ใน C ++ 11 (เหตุผลอื่นนอกเหนือจากปัญหาความเข้ากันได้กับรหัสที่มีอยู่นั่นคือ)

6
ย้ายตัวดำเนินการกำหนดและ "if (this! = & rhs)"
ในตัวดำเนินการมอบหมายของคลาสคุณมักจะต้องตรวจสอบว่าออบเจ็กต์ที่ถูกกำหนดเป็นอ็อบเจกต์ที่เรียกใช้หรือไม่เพื่อที่คุณจะได้ไม่พลาด: Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment } return *this; } คุณต้องการสิ่งเดียวกันสำหรับตัวดำเนินการมอบหมายการย้ายหรือไม่? เคยมีสถานการณ์ที่this == &rhsจะเป็นจริงหรือไม่? ? Class::operator=(Class&& rhs) { ? }

2
แลมบ์ดาจับและพารามิเตอร์ที่มีชื่อเดียวกันใครเป็นเงาของอีกฝ่าย? (เสียงดังกับ gcc)
auto foo = "You're using g++!"; auto compiler_detector = [foo](auto foo) { std::puts(foo); }; compiler_detector("You're using clang++!"); เสียงดัง ++ 3.6.0และใหม่กว่าพิมพ์"คุณกำลังใช้เสียงดัง ++!" และเตือนเกี่ยวกับการจับภาพ fooที่ไม่ได้ใช้งาน g ++ 4.9.0และใหม่กว่าพิมพ์"คุณกำลังใช้ g ++!" และเตือนเกี่ยวกับพารามิเตอร์ fooที่ไม่ได้ใช้งาน คอมไพเลอร์ใดที่ทำตามมาตรฐาน C ++ ได้แม่นยำกว่าที่นี่ ตัวอย่าง Wandbox

3
1.0 เป็นเอาต์พุตที่ถูกต้องจาก std :: create_canonical หรือไม่
ฉันคิดเสมอว่าตัวเลขสุ่มจะอยู่ระหว่างศูนย์และหนึ่งโดยที่ไม่ใช่1ตัวเลขจากช่วงครึ่งเปิด [0,1) documention บน cppreference.comของstd::generate_canonicalยืนยันนี้ อย่างไรก็ตามเมื่อฉันเรียกใช้โปรแกรมต่อไปนี้: #include <iostream> #include <limits> #include <random> int main() { std::mt19937 rng; std::seed_seq sequence{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; rng.seed(sequence); rng.discard(12 * 629143 + 6); float random = std::generate_canonical<float, std::numeric_limits<float>::digits>(rng); if (random == 1.0f) { std::cout << "Bug!\n"; } return 0; …
124 c++  c++11  random 

2
c ++ 11 lambdas จับตัวแปรที่ไม่ได้ใช้หรือไม่
เมื่อฉันใช้[=]เพื่อบ่งชี้ว่าผมอยากตัวแปรท้องถิ่นทั้งหมดจะถูกจับโดยค่าในแลมบ์ดาจะส่งผลให้ทุกตัวแปรท้องถิ่นในฟังก์ชั่นการคัดลอกหรือเพียงแค่ทุกตัวแปรท้องถิ่นที่ใช้โดยแลมบ์ดา ? ตัวอย่างเช่นถ้าฉันมี: vector<int> my_huge_vector(100000); int my_measly_int; some_function([=](int i){ return my_measly_int + i; }); my_huge_vector จะถูกคัดลอกหรือไม่แม้ว่าฉันจะไม่ได้ใช้ในแลมบ์ดา
124 c++  lambda  c++11 

3
การใช้ตัวชี้นี้ทำให้เกิดการลดประสิทธิภาพแบบแปลก ๆ ใน hot loop
ฉันเพิ่งเจอการลดประสิทธิภาพแบบแปลก ๆ (หรือค่อนข้างพลาดโอกาสในการเพิ่มประสิทธิภาพ) พิจารณาฟังก์ชันนี้เพื่อการคลายอาร์เรย์ของจำนวนเต็ม 3 บิตเป็นจำนวนเต็ม 8 บิตอย่างมีประสิทธิภาพ มันคลาย 16 ints ในการวนซ้ำแต่ละครั้ง: void unpack3bit(uint8_t* target, char* source, int size) { while(size > 0){ uint64_t t = *reinterpret_cast<uint64_t*>(source); target[0] = t & 0x7; target[1] = (t >> 3) & 0x7; target[2] = (t >> 6) & 0x7; target[3] = (t >> …

6
ข้อผิดพลาด: การใช้ฟังก์ชันที่ถูกลบ
ฉันทำงานกับรหัส C ++ ที่เพื่อนเขียนและได้รับข้อผิดพลาดต่อไปนี้ที่ฉันไม่เคยเห็นมาก่อนเมื่อคอมไพล์กับ gcc4.6: error: use of deleted function ‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed: uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’ แก้ไข: สิ่งนี้มาจากส่วนหนึ่งของโค้ดโดยใช้ boost MSM: Boost Webpage แก้ไข 2: ไม่มีการ= delete()ใช้ที่ใดก็ได้ในซอร์สโค้ด โดยทั่วไปแล้วข้อผิดพลาดนี้หมายถึงอะไร? ฉันควรมองหาอะไรเมื่อเกิดข้อผิดพลาดประเภทนี้

5
เหตุใด C ++ 11 จึงไม่รองรับรายการ initializer ที่กำหนดเป็น C99 [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ พิจารณา: struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; } รหัสด้านบนถูกต้องตามกฎหมายใน C99 แต่ไม่ถูกกฎหมายใน C ++ 11 สิ่งที่เป็น C ++ 11 เหตุผลของคณะกรรมการมาตรฐานในการยกเว้นการสนับสนุนคุณลักษณะที่มีประโยชน์เช่นนี้หรือไม่?
121 c++  c  c++11  initialization  c99 

2
std :: tie ทำงานอย่างไร?
ฉันใช้std::tieโดยไม่ต้องคิดมากกับมัน มันใช้งานได้ดังนั้นฉันจึงยอมรับว่า: auto test() { int a, b; std::tie(a, b) = std::make_tuple(2, 3); // a is now 2, b is now 3 return a + b; // 5 } แต่มนต์ดำนี้ทำงานอย่างไร? ชั่วคราวสร้างขึ้นโดยstd::tieการเปลี่ยนแปลงอย่างไรaและb? ฉันพบว่าสิ่งนี้น่าสนใจมากขึ้นเนื่องจากเป็นคุณลักษณะของไลบรารีไม่ใช่คุณลักษณะด้านภาษาดังนั้นจึงเป็นสิ่งที่เราสามารถนำไปใช้ได้ด้วยตนเองและเข้าใจ
120 c++  c++11  tuples 

4
ฉันจะเปิดใช้งาน C ++ 11 ใน gcc ได้อย่างไร
ฉันใช้ gcc 4.8.1 จากhttp://hpc.sourceforge.netบน Mac OSX Mountain Lion ฉันพยายามรวบรวมโปรแกรม C ++ ซึ่งใช้to_stringฟังก์ชันใน<string>. ฉันต้องใช้ธง-std=c++11ทุกครั้ง: g++ -std=c++11 -o testcode1 code1.cpp มีวิธีรวมแฟล็กนี้โดยค่าเริ่มต้นหรือไม่?
119 c++11  g++ 

2
เริ่มต้นเวกเตอร์เป็นศูนย์ C ++ / C ++ 11
ฉันรู้ว่าใน C ++ 11 พวกเขาเพิ่มคุณสมบัติเพื่อเริ่มต้นตัวแปรเป็นศูนย์เช่นนี้ double number = {}; // number = 0 int data{}; // data = 0 มีวิธีที่คล้ายกันในการเริ่มต้นstd::vectorความยาวคงที่เป็นศูนย์ทั้งหมดหรือไม่?
118 c++  c++11 

7
ความถูกต้องตามกฎหมายของ COW std :: การใช้สตริงใน C ++ 11
เป็นความเข้าใจของฉันที่ว่าการคัดลอกเมื่อเขียนไม่ใช่วิธีที่เป็นไปได้std::stringในการนำการปฏิบัติตามC ++ 11 มาใช้ แต่เมื่อมีการอภิปรายเมื่อเร็ว ๆ นี้ฉันพบว่าตัวเองไม่สามารถสนับสนุนคำพูดนั้นได้โดยตรง ฉันถูกต้องหรือไม่ที่ C ++ 11 ไม่ยอมรับการใช้งาน COW ของstd::string? หากเป็นเช่นนั้นข้อ จำกัด นี้มีการระบุไว้อย่างชัดเจนในมาตรฐานใหม่ (ที่ไหน) หรือไม่? หรือข้อ จำกัด นี้โดยนัยในแง่ที่ว่ามันเป็นผลรวมของความต้องการใหม่ในติ๊ดว่าการดำเนินการตามวัวของstd::string std::stringในกรณีนี้ฉันสนใจในบทและรูปแบบกลอนที่มาของ 'C ++ 11 ห้ามใช้std::stringงานCOW อย่างมีประสิทธิภาพ'

1
async (launch :: async) ใน C ++ 11 ทำให้เธรดพูลล้าสมัยเนื่องจากหลีกเลี่ยงการสร้างเธรดที่มีราคาแพงหรือไม่
มันเกี่ยวข้องกับคำถามนี้อย่างหลวม ๆ : std :: thread รวมอยู่ใน C ++ 11 หรือไม่? . แม้ว่าคำถามจะแตกต่างกัน แต่ความตั้งใจก็เหมือนกัน: คำถามที่ 1: การใช้เธรดพูลของคุณเอง (หรือไลบรารีของบุคคลที่สาม) เพื่อหลีกเลี่ยงการสร้างเธรดที่มีราคาแพงหรือไม่ ข้อสรุปในคำถามอื่นคือคุณไม่สามารถพึ่งพาstd::threadการรวมกลุ่มกันได้ (อาจเป็นหรือไม่ก็ได้) อย่างไรก็ตามstd::async(launch::async)ดูเหมือนว่าจะมีโอกาสสูงกว่าที่จะถูกรวมกลุ่ม ไม่คิดว่าจะถูกบังคับโดยมาตรฐาน แต่ IMHO ฉันคาดหวังว่าการใช้งาน C ++ 11 ที่ดีทั้งหมดจะใช้การรวมเธรดหากการสร้างเธรดช้า เฉพาะบนแพลตฟอร์มที่มีราคาไม่แพงในการสร้างเธรดใหม่ฉันคาดหวังว่าพวกเขาจะสร้างเธรดใหม่เสมอ คำถาม 2: นี่เป็นเพียงสิ่งที่ฉันคิด แต่ฉันไม่มีข้อเท็จจริงที่จะพิสูจน์ได้ ฉันอาจจะเข้าใจผิด เป็นการคาดเดาที่มีการศึกษาหรือไม่? สุดท้ายนี้ฉันได้ให้โค้ดตัวอย่างที่แสดงให้เห็นก่อนว่าฉันคิดว่าการสร้างเธรดสามารถแสดงได้อย่างไรasync(launch::async): ตัวอย่างที่ 1: thread t([]{ f(); }); // ... t.join(); กลายเป็น auto future …

8
static_assert ทำอะไรและคุณจะใช้เพื่ออะไร
คุณช่วยยกตัวอย่างได้ไหมว่าstatic_assert(...)('C ++ 11') จะแก้ปัญหาได้อย่างสวยงาม? assert(...)ผมคุ้นเคยกับเวลาทำงาน เมื่อไหร่ที่ฉันควรชอบstatic_assert(...)มากกว่าปกติassert(...)? นอกจากนี้ในboostนั้นมีสิ่งที่เรียกว่าBOOST_STATIC_ASSERTมันเหมือนกับstatic_assert(...)?

8
สามารถตรวจพบความแตกต่างอะไรระหว่าง C ++ 03 และ C ++ 11 ในขณะรันไทม์
เป็นไปได้ที่จะเขียนฟังก์ชันซึ่งเมื่อคอมไพล์ด้วยคอมไพเลอร์ C จะส่งกลับ 0 และเมื่อคอมไพล์ด้วยคอมไพเลอร์ C ++ จะส่งคืน 1 (การเจือจางเล็กน้อยด้วย #ifdef __cplusplusไม่น่าสนใจ) ตัวอย่างเช่น: int isCPP() { return sizeof(char) == sizeof 'c'; } แน่นอนข้างต้นจะใช้ได้ก็ต่อเมื่อsizeof (char)ไม่เหมือนกับsizeof (int) อีกวิธีหนึ่งที่พกพาสะดวกกว่าคือสิ่งนี้: int isCPP() { typedef int T; { struct T { int a[2]; }; return sizeof(T) == sizeof(struct T); } } ฉันไม่แน่ใจว่าตัวอย่างถูกต้อง 100% แต่คุณเข้าใจแล้ว ฉันเชื่อว่ามีวิธีอื่นในการเขียนฟังก์ชันเดียวกันด้วย …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.