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

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

3
ค่าเริ่มต้นค่าและความยุ่งเหยิงในการเริ่มต้นเป็นศูนย์
ฉันสับสนมากเกี่ยวกับ value- & default- & zero-initialization และโดยเฉพาะอย่างยิ่งเมื่อพวกเขาเริ่มใช้มาตรฐานC ++ 03และC ++ 11ที่แตกต่างกัน(และC ++ 14 ) ฉันกำลังอ้างถึงและพยายามขยายคำตอบที่ดีจริงๆValue- / Default- / Zero- Init C ++ 98และC ++ 03ที่นี่เพื่อให้กว้างขึ้นเนื่องจากจะช่วยผู้ใช้จำนวนมากหากมีใครช่วยกรอก จำเป็นต้องมีช่องว่างเพื่อให้มีภาพรวมที่ดีว่าจะเกิดอะไรขึ้นเมื่อใด ข้อมูลเชิงลึกทั้งหมดโดยตัวอย่างโดยสรุป: บางครั้งหน่วยความจำที่ส่งคืนโดยตัวดำเนินการใหม่จะถูกเตรียมใช้งานและบางครั้งก็ไม่ขึ้นอยู่กับว่าประเภทที่คุณกำลังสร้างขึ้นใหม่นั้นเป็นPOD (ข้อมูลเก่าธรรมดา)หรือถ้าเป็นคลาสที่มีสมาชิก POD และใช้ ตัวสร้างเริ่มต้นที่สร้างโดยคอมไพเลอร์ ในC ++ 1998มีการกำหนดค่าเริ่มต้น 2 ประเภท: zero-และdefault-initialization ในC ++ 2003เป็นประเภทที่ 3 ของการเริ่มต้นการกำหนดค่าเริ่มต้นถูกเพิ่ม ในC ++ 2011 / C ++ 2014มีการเพิ่มเฉพาะรายการเริ่มต้นและกฎสำหรับค่า- …
89 c++  c++11  c++14  c++03  c++98 

5
การส่งพอยน์เตอร์ที่ใช้ร่วมกันเป็นอาร์กิวเมนต์
ถ้าฉันประกาศว่าวัตถุที่อยู่ในตัวชี้ที่ใช้ร่วมกัน: std::shared_ptr<myClass> myClassObject(new myClass()); จากนั้นฉันต้องการส่งต่อเป็นอาร์กิวเมนต์ให้กับวิธีการ: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr<myClass> arg1) { arg1->someField = 4; } ข้างต้นเพียงแค่เพิ่มจำนวนการอ้างอิงของ shared_pt และทุกอย่างจะดี? หรือไม่ทิ้งตัวชี้ห้อย? คุณยังควรทำสิ่งนี้หรือไม่: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr<myClass>* arg1) { (*arg1)->someField = 4; } ฉันคิดว่าวิธีที่ 2 อาจมีประสิทธิภาพมากกว่าเพราะต้องคัดลอกที่อยู่ 1 รายการเท่านั้น (ตรงข้ามกับตัวชี้อัจฉริยะทั้งหมด) แต่วิธีที่ 1 ดูเหมือนจะอ่านได้มากกว่าและฉันไม่คาดว่าจะมีการ จำกัด ประสิทธิภาพการทำงาน ฉันแค่อยากให้แน่ใจว่าไม่มีอะไรอันตรายเกี่ยวกับเรื่องนี้ ขอขอบคุณ.

6
แบบอิงตามช่วงสำหรับการทำงานสำหรับอาร์เรย์ธรรมดาอย่างไร
ใน C ++ 11 คุณสามารถใช้การอ้างอิงตามช่วงforซึ่งทำหน้าที่เป็นforeachภาษาอื่น ๆ ใช้งานได้แม้กับอาร์เรย์ C ธรรมดา: int numbers[] = { 1, 2, 3, 4, 5 }; for (int& n : numbers) { n *= 2; } จะรู้ได้อย่างไรว่าเมื่อไรควรหยุด? ใช้ได้เฉพาะกับอาร์เรย์แบบคงที่ที่ได้รับการประกาศในขอบเขตเดียวกันกับforใช้หรือไม่? คุณจะใช้สิ่งนี้forกับอาร์เรย์แบบไดนามิกอย่างไร
88 c++  arrays  foreach  c++11 

2
ประสิทธิภาพของ C ++ 11 push_back () พร้อม std :: move เทียบกับ emplace_back () สำหรับอ็อบเจ็กต์ที่สร้างไว้แล้ว
emplace_back()โดยทั่วไปแล้วใน C ++ 11 เป็นที่ต้องการ (ในแง่ของประสิทธิภาพ) push_back()เนื่องจากอนุญาตให้มีการก่อสร้างในสถานที่แต่ก็ยังคงเป็นเช่นนี้เมื่อใช้push_back(std::move())กับวัตถุที่สร้างไว้แล้วหรือไม่ ตัวอย่างเช่นemplace_back()ยังคงเป็นที่ต้องการในกรณีต่อไปนี้? std::string mystring("hello world"); std::vector<std::string> myvector; myvector.emplace_back(mystring); myvector.push_back(std::move(mystring)); // (of course assuming we don't care about using the value of mystring after) นอกจากนี้มีประโยชน์ในตัวอย่างข้างต้นหรือไม่ที่จะทำ: myvector.emplace_back(std::move(mystring)); หรือการย้ายที่นี่ซ้ำซ้อนทั้งหมดหรือไม่มีผล?

5
การทำความเข้าใจ std :: atomic :: Compare_exchange_weak () ใน C ++ 11
bool compare_exchange_weak (T& expected, T val, ..); compare_exchange_weak()เป็นหนึ่งในการเปรียบเทียบแบบดั้งเดิมของการแลกเปลี่ยนที่มีให้ใน C ++ 11 มันอ่อนแอexpectedในแง่ที่ว่ามันกลับเท็จแม้ว่ามูลค่าของวัตถุที่มีค่าเท่ากับ นี่เป็นเพราะความล้มเหลวปลอมในบางแพลตฟอร์มที่มีการใช้ลำดับของคำสั่ง (แทนที่จะเป็นหนึ่งใน x86) เพื่อใช้งาน บนแพลตฟอร์มดังกล่าวการสลับบริบทการโหลดที่อยู่เดียวกัน (หรือบรรทัดแคช) ซ้ำโดยเธรดอื่น ฯลฯ อาจทำให้ระบบดั้งเดิมล้มเหลว มันspuriousไม่ใช่ค่าของวัตถุ (ไม่เท่ากับexpected) ที่ทำให้การดำเนินการล้มเหลว แต่มันเป็นปัญหาเรื่องเวลา แต่สิ่งที่ทำให้ฉันไขปริศนาคือสิ่งที่พูดใน C ++ 11 Standard (ISO / IEC 14882) 29.6.5 .. ผลที่ตามมาของความล้มเหลวปลอมคือการใช้การเปรียบเทียบและแลกเปลี่ยนที่อ่อนแอเกือบทั้งหมดจะวนเวียน เหตุใดจึงต้องวนซ้ำในการใช้งานเกือบทั้งหมด ? นั่นหมายความว่าเราจะวนซ้ำเมื่อมันล้มเหลวเพราะความล้มเหลวปลอม ๆ ? ถ้าเป็นเช่นนั้นทำไมเราต้องใช้compare_exchange_weak()และเขียนลูปด้วยตัวเอง? เราสามารถใช้compare_exchange_strong()สิ่งที่ฉันคิดว่าควรกำจัดความล้มเหลวปลอมให้เราได้ อะไรคือกรณีการใช้งานทั่วไปของcompare_exchange_weak()? คำถามอื่นที่เกี่ยวข้อง ในหนังสือของเขา "C ++ Concurrency …

5
ตัวเลือกลิงค์ที่ถูกต้องในการใช้ std :: thread ใน GCC ภายใต้ linux คืออะไร?
สวัสดีฉันกำลังพยายามใช้std::threadกับ G ++ นี่คือรหัสทดสอบของฉัน #include <thread> #include <iostream> int main(int, char **){ std::thread tt([](){ std::cout<<"Thread!"<<std::endl; }); tt.join(); } มันรวบรวม แต่เมื่อฉันพยายามเรียกใช้ผลลัพธ์คือ: terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted Aborted เวอร์ชันคอมไพเลอร์ของฉัน: $ g++ --version g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Copyright (C) 2011 Free Software Foundation, Inc. This is …

6
ฉันจะรวมค่าแฮชใน C ++ 0x ได้อย่างไร
C ++ 0x hash<...>(...)เพิ่ม ฉันไม่สามารถหาhash_combineแต่ฟังก์ชั่นที่นำเสนอในการเพิ่ม อะไรคือวิธีที่สะอาดที่สุดในการนำสิ่งนี้ไปใช้? บางทีอาจจะใช้ C ++ 0x xor_combine?
87 c++  c++11  boost  hash  std 

1
C ++ 11: จำนวนพารามิเตอร์ฟังก์ชันแม่แบบตัวแปร?
ฉันจะนับจำนวนอาร์กิวเมนต์ของฟังก์ชันเทมเพลตตัวแปรได้อย่างไร กล่าวคือ: template<typename... T> void f(const T&... t) { int n = number_of_args(t); ... } วิธีใดที่ดีที่สุดในการนำไปใช้number_of_argsในข้างต้น

16
วิธีเขียนโค้ดตัวดำเนินการ modulo (%) ใน C / C ++ / Obj-C ที่จัดการตัวเลขติดลบ
สัตว์เลี้ยงตัวหนึ่งของฉันเกลียดภาษาที่ได้รับ C (ในฐานะนักคณิตศาสตร์) ก็คือ (-1) % 8 // comes out as -1, and not 7 fmodf(-1,8) // fails similarly ทางออกที่ดีที่สุดคืออะไร? C ++ ช่วยให้แม่แบบและตัวดำเนินการทำงานมากเกินไป แต่ทั้งสองอย่างนี้เป็นน้ำที่ขุ่นมัวสำหรับฉัน ตัวอย่างที่ได้รับอย่างซาบซึ้ง

4
ฟีเจอร์ทดลองของ C ++ สมัยใหม่เชื่อถือได้สำหรับโครงการระยะยาวหรือไม่?
ฉันมีโปรเจ็กต์ที่ใช้ C ++ 11/14 อยู่ในขณะนี้ แต่มันต้องการบางอย่างเช่นstd::filesystemซึ่งมีเฉพาะใน C ++ 17 เท่านั้นดังนั้นฉันจึงไม่มีโอกาสใช้มันในตอนนี้ อย่างไรก็ตามฉันเห็นว่ามีอยู่ในคอมไพเลอร์ปัจจุบันของฉันในชื่อstd::experimental::filesystemไฟล์. เป็นความคิดที่ดีไหมที่จะใช้ฟีเจอร์ทดลองโดยสมมติว่าในอนาคตฉันสามารถเพิ่มสิ่งต่างๆเช่น: #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif ข้อกังวลของฉันคือ: 1. รับประกันหรือไม่ว่าคอมไพเลอร์ที่เข้ากันได้ทั้งหมดมีคุณสมบัติการทดลองเหมือนกัน? 2. ฟีเจอร์ทดลองมีแนวโน้มที่จะเกิดการเปลี่ยนแปลงครั้งใหญ่ที่ทำให้ไม่น่าเชื่อถือหรือไม่? อาจจะมีอะไรให้สงสัยอีก เหตุใดฉันจึงควรหรือไม่ควรใช้ ฉันงงงวยกับโครงการใหม่และไม่รู้ว่าจะตัดสินใจอะไร

8
คือ 'float a = 3.0;' คำสั่งที่ถูกต้อง?
หากฉันมีคำประกาศดังต่อไปนี้: float a = 3.0 ; เป็นข้อผิดพลาดหรือไม่? ผมอ่านในหนังสือที่3.0เป็นคุณค่าและว่าผมจะต้องระบุว่าเป็นdouble float a = 3.0fมันเป็นอย่างนั้นเหรอ?
86 c++  c++11 

4
เหตุใดฟังก์ชันสมาชิก const จึงสามารถแก้ไขสมาชิกข้อมูลคงที่ได้
ในC++โปรแกรมต่อไปนี้การแก้ไขสมาชิกข้อมูลแบบคงที่จากconstฟังก์ชันทำงานได้ดี: class A { public: static int a; // static data member void set() const { a = 10; } }; แต่การแก้ไขสมาชิกข้อมูลที่ไม่คงที่จากconstฟังก์ชันไม่ทำงาน: class A { public: int a; // non-static data member void set() const { a = 10; } }; เหตุใดconstฟังก์ชันสมาชิกจึงสามารถแก้ไขstaticสมาชิกข้อมูลได้

4
ฉันสามารถใช้ C ++ 11 กับ Xcode ได้หรือไม่
ฉันกำลังพิจารณาการใช้คุณสมบัติบางอย่างของ C ++ 11 (เช่นautoเช่น) ในโครงการข้ามแพลตฟอร์ม (Windows + Mac) ใน Windows Visual Studio รองรับบางส่วนของมาตรฐาน C ++ 11 ที่กำลังจะมาถึงซึ่งจะช่วยให้ฉันสามารถลดความซับซ้อนของส่วนต่างๆของฐานรหัสได้อย่างเป็นธรรมชาติดังนั้นฉันจึงสนใจที่จะเริ่มใช้คุณสมบัติเหล่านี้ แต่เท่าที่ทราบ XCode เวอร์ชันปัจจุบัน (3.2.4 + GCC 4.2) ไม่รองรับฟีเจอร์ C ++ 11 ใด ๆ เลย ฉันสามารถอัปเกรดเวอร์ชัน GCC หรือเวอร์ชัน CLang ได้หรือไม่? หรือฉันควรจะกัดลิ้นตัวเองและรอให้ Apple บรรจุเวอร์ชันใหม่ในอนาคต
86 c++  xcode  gcc  c++11  clang 

8
การ จำกัด การแปลงใน C ++ 0x มันเป็นแค่ตัวฉันเองหรือนี่ฟังดูเหมือนเป็นการเปลี่ยนแปลงอย่างสิ้นเชิง?
C ++ 0x จะสร้างโค้ดต่อไปนี้และโค้ดที่คล้ายกันมีรูปแบบไม่ถูกต้องเนื่องจากต้องมีการแปลงที่เรียกว่าการแปลง a doubleเป็นint. int a[] = { 1.0 }; ฉันสงสัยว่าการเริ่มต้นประเภทนี้ใช้มากในรหัสโลกแห่งความเป็นจริงหรือไม่ การเปลี่ยนแปลงนี้จะเสียรหัสกี่รหัส การแก้ไขในโค้ดของคุณมีความพยายามมากหรือไม่หากโค้ดของคุณได้รับผลกระทบเลย สำหรับการอ้างอิงโปรดดูที่ 8.5.4 / 6 ของ n3225 Conversion ที่แคบลงคือการแปลงโดยปริยาย จากประเภททศนิยมไปยังประเภทจำนวนเต็มหรือ จาก long double ไปเป็น double หรือ float หรือจาก double ไปจนถึง float ยกเว้นที่มาคือนิพจน์คงที่และมูลค่าที่แท้จริงหลังการแปลงอยู่ในช่วงของค่าที่สามารถแสดงได้ (แม้ว่าจะไม่สามารถแสดงได้อย่างแน่นอน) หรือ จากประเภทจำนวนเต็มหรือประเภทการแจงนับที่ไม่ได้กำหนดขอบเขตเป็นประเภทจุด oating ยกเว้นที่มาเป็นนิพจน์คงที่และมูลค่าที่แท้จริงหลังจากการแปลงจะพอดีกับประเภทเป้าหมายและจะให้ค่าเดิมเมื่อแปลงกลับเป็นประเภทเดิมหรือ จากประเภทจำนวนเต็มหรือประเภทการแจงนับที่ไม่ได้กำหนดขอบเขตไปเป็นประเภทจำนวนเต็มที่ไม่สามารถแสดงค่าทั้งหมดของประเภทเดิมได้ยกเว้นที่มาเป็นนิพจน์คงที่และมูลค่าจริงหลังจากการแปลงจะพอดีกับประเภทเป้าหมายและจะสร้างค่าดั้งเดิมเมื่อ แปลงกลับเป็นประเภทเดิม

13
คีย์เวิร์ดที่ลบเลือน C ++ แนะนำรั้วหน่วยความจำหรือไม่
ฉันเข้าใจว่าvolatileแจ้งให้คอมไพเลอร์ทราบว่าค่าอาจมีการเปลี่ยนแปลง แต่เพื่อให้ฟังก์ชันนี้สำเร็จคอมไพเลอร์จำเป็นต้องแนะนำรั้วหน่วยความจำเพื่อให้ใช้งานได้หรือไม่ จากความเข้าใจของฉันลำดับของการดำเนินการกับวัตถุระเหยไม่สามารถจัดเรียงใหม่ได้และต้องรักษาไว้ สิ่งนี้ดูเหมือนจะบ่งบอกถึงความทรงจำบางอย่างที่จำเป็นและไม่มีทางแก้ไขได้ ฉันพูดถูกต้องหรือเปล่า มีการอภิปรายที่น่าสนใจสำหรับคำถามที่เกี่ยวข้องนี้ Jonathan Wakely เขียน : ... การเข้าถึงตัวแปรระเหยที่แตกต่างกันไม่สามารถจัดลำดับใหม่โดยคอมไพเลอร์ได้ตราบเท่าที่เกิดขึ้นในนิพจน์เต็มแยกต่างหาก ... ใช่ว่าการระเหยนั้นไร้ประโยชน์สำหรับความปลอดภัยของเธรด แต่ไม่ใช่ด้วยเหตุผลที่เขาให้ ไม่ใช่เพราะคอมไพเลอร์อาจจัดลำดับการเข้าถึงวัตถุที่ระเหยได้ แต่เป็นเพราะ CPU อาจเรียงลำดับใหม่ การดำเนินการของอะตอมและอุปสรรคของหน่วยความจำป้องกันไม่ให้คอมไพเลอร์และ CPU จัดลำดับใหม่ ซึ่งDavid Schwartzตอบกลับในความคิดเห็น : ... ไม่มีความแตกต่างจากมุมมองของมาตรฐาน C ++ ระหว่างคอมไพเลอร์กำลังทำอะไรบางอย่างกับคอมไพเลอร์ส่งคำสั่งที่ทำให้ฮาร์ดแวร์ทำบางอย่าง หากซีพียูอาจจัดลำดับการเข้าถึงใหม่ไปยัง volatiles มาตรฐานก็ไม่จำเป็นต้องรักษาลำดับของมันไว้ ... ... มาตรฐาน C ++ ไม่ได้สร้างความแตกต่างเกี่ยวกับสิ่งที่จัดลำดับใหม่ และคุณไม่สามารถโต้แย้งได้ว่า CPU สามารถเรียงลำดับใหม่ได้โดยไม่มีเอฟเฟกต์ที่สังเกตเห็นได้ดังนั้นจึงไม่เป็นไร - มาตรฐาน C ++ กำหนดลำดับของมันให้สังเกตได้ คอมไพเลอร์เป็นไปตามมาตรฐาน C ++ …

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