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

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

8
เมื่อใดที่ฉันควรใช้ noexcept จริงๆ
noexceptคำหลักที่สามารถนำมาประยุกต์ใช้ให้เหมาะสมกับลายเซ็นฟังก์ชั่นจำนวนมาก แต่ผมไม่แน่ใจว่าเมื่อฉันควรพิจารณาใช้มันในทางปฏิบัติ จากสิ่งที่ฉันได้อ่านจนถึงตอนนี้noexceptดูเหมือนว่าประเด็นสำคัญบางอย่างที่เกิดขึ้นเมื่อมีการเคลื่อนย้ายสิ่งก่อสร้าง อย่างไรก็ตามฉันยังคงไม่สามารถให้คำตอบที่น่าพอใจสำหรับคำถามเชิงปฏิบัติบางอย่างที่ทำให้ฉันอ่านเพิ่มเติมเกี่ยวกับnoexceptในตอนแรก มีตัวอย่างมากมายของฟังก์ชั่นที่ฉันรู้ว่าจะไม่ทิ้ง แต่สำหรับคอมไพเลอร์ไม่สามารถกำหนดได้ด้วยตัวเอง ฉันควรผนวกท้ายnoexceptประกาศฟังก์ชันในทุกกรณีเช่นนี้หรือไม่? ต้องคิดก่อนว่าจะต้องต่อท้ายหรือไม่noexceptหลังจากการประกาศฟังก์ชั่นทุกครั้งจะลดประสิทธิภาพการทำงานของโปรแกรมเมอร์ลงอย่างมาก (และตรงไปตรงมาจะเป็นความเจ็บปวดในตูด) สำหรับสถานการณ์ที่ฉันควรจะระมัดระวังมากขึ้นเกี่ยวกับการใช้noexceptและสำหรับสถานการณ์ที่ฉันจะได้รับไปด้วยนัยnoexcept(false)? ฉันสามารถเมื่อแนบเนียนคาดหวังที่จะสังเกตการปรับปรุงประสิทธิภาพการทำงานหลังจากที่ใช้noexcept? โดยเฉพาะอย่างยิ่งให้ตัวอย่างของรหัสที่คอมไพเลอร์ C ++ noexceptสามารถสร้างรหัสเครื่องดีขึ้นหลังจากที่นอกเหนือจากคะแนน โดยส่วนตัวแล้วฉันสนใจnoexceptเพราะมีอิสระมากขึ้นในการรวบรวมเพื่อใช้การเพิ่มประสิทธิภาพบางประเภทอย่างปลอดภัย คอมไพเลอร์สมัยใหม่ใช้ประโยชน์จากnoexceptวิธีนี้หรือไม่? ถ้าไม่ฉันสามารถคาดหวังให้พวกเขาบางคนทำเช่นนั้นได้ในอนาคตอันใกล้

6
อะไรคือวัตถุประสงค์หลักของการใช้ std :: forward และปัญหาอะไรที่แก้ได้?
ในการส่งต่อที่สมบูรณ์แบบstd::forwardใช้เพื่อแปลงการอ้างอิง rvalue ที่ระบุชื่อt1และt2การอ้างอิง rvalue ที่ไม่มีชื่อ จุดประสงค์ของการทำเช่นนั้นคืออะไร? สิ่งนั้นจะส่งผลกระทบต่อฟังก์ชั่นที่ถูกเรียกหรือไม่innerถ้าเราปล่อยให้t1& t2เป็นค่า? template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

6
C ++ 11 rvalues ​​และย้ายความสับสนของซีแมนทิกส์ (คำสั่ง return)
ฉันพยายามเข้าใจการอ้างอิงค่าและย้ายซีแมนทิกส์ของ C ++ 11 อะไรคือความแตกต่างระหว่างตัวอย่างเหล่านี้และสิ่งใดที่จะไม่คัดลอกเวกเตอร์ ตัวอย่างแรก std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); ตัวอย่างที่สอง std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); ตัวอย่างที่สาม std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();

4
ทำไมการเริ่มต้นรายการ (โดยใช้เครื่องหมายปีกกาแบบโค้ง) ดีกว่าตัวเลือกอื่น ๆ
MyClass a1 {a}; // clearer and less error-prone than the other three MyClass a2 = {a}; MyClass a3 = a; MyClass a4(a); ทำไม? ฉันไม่พบคำตอบใน SO ดังนั้นให้ฉันตอบคำถามของฉันเอง

6
ฉันจะส่งผ่านอาร์กิวเมนต์ unique_ptr ไปยังตัวสร้างหรือฟังก์ชันได้อย่างไร
ฉันใหม่เพื่อย้ายซีแมนทิกส์ใน C ++ 11 และฉันไม่รู้วิธีจัดการunique_ptrพารามิเตอร์ใน Constructor หรือฟังก์ชั่น พิจารณาคลาสนี้อ้างอิง: #include <memory> class Base { public: typedef unique_ptr<Base> UPtr; Base(){} Base(Base::UPtr n):next(std::move(n)){} virtual ~Base(){} void setNext(Base::UPtr n) { next = std::move(n); } protected : Base::UPtr next; }; นี่เป็นวิธีที่ฉันควรจะเขียนฟังก์ชั่นการunique_ptrโต้แย้ง? และฉันต้องใช้std::moveในรหัสโทรหรือไม่ Base::UPtr b1; Base::UPtr b2(new Base()); b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?


10
พริตตี้คอนเทนเนอร์ C ++ STL แบบสวย
โปรดรับทราบการปรับปรุงในตอนท้ายของโพสต์นี้ อัปเดต: ฉันได้สร้างโครงการสาธารณะบน GitHubสำหรับห้องสมุดนี้แล้ว! ผมอยากจะมีแม่แบบเดียวที่และทุกครั้งจะดูแลสวยพิมพ์ภาชนะ STL operator<<ทั้งหมดผ่าน ในรหัสหลอกฉันกำลังมองหาสิ่งนี้: template<container C, class T, String delim = ", ", String open = "[", String close = "]"> std::ostream & operator<<(std::ostream & o, const C<T> & x) { o << open; // for (typename C::const_iterator i = x.begin(); i != x.end(); i++) /* …

9
std :: สัญญาคืออะไร?
ผมค่อนข้างคุ้นเคยกับ C ++ 11 std::thread, std::asyncและstd::futureส่วนประกอบ (เช่นดูคำตอบนี้ ) ซึ่งจะตรงไปข้างหน้า อย่างไรก็ตามฉันไม่สามารถเข้าใจได้ว่าstd::promiseมันคืออะไรมันทำอะไรและใช้ในสถานการณ์แบบไหนดีที่สุด เอกสารมาตรฐานนั้นไม่มีข้อมูลจำนวนมากเกินกว่าบทสรุปในชั้นเรียนและไม่มีเพียง :: เธรดเพียง ใครช่วยกรุณาstd::promiseเล่าตัวอย่างสั้น ๆ สังเขปของสถานการณ์ที่จำเป็นและเป็นวิธีแก้ปัญหาที่สำนวนที่สุด?

1
เทมเพลต C ++ เทมเพลต
ฉันมีเรียน template<size_t N, size_t M> class Matrix { // .... }; ฉันต้องการสร้าง a typedefซึ่งสร้างVector(เวกเตอร์คอลัมน์) ซึ่งเทียบเท่ากับ a Matrixขนาด N และ 1 สิ่งที่ต้องการ: typedef Matrix<N,1> Vector<N>; ซึ่งก่อให้เกิดข้อผิดพลาดในการรวบรวม ต่อไปนี้สร้างสิ่งที่คล้ายกัน แต่ไม่ใช่สิ่งที่ฉันต้องการ: template <size_t N> class Vector: public Matrix<N,1> { }; มีวิธีแก้ปัญหาหรือวิธีแก้ปัญหา / แนวทางปฏิบัติที่ไม่แพงเกินไปหรือไม่?
368 c++  templates  c++11  typedef 

5
ส่งคืน unique_ptr จากฟังก์ชั่น
unique_ptr<T>ไม่อนุญาตการสร้างสำเนา แต่จะรองรับซีแมนทิกส์ของการย้าย แต่ฉันสามารถคืนค่าunique_ptr<T>จากฟังก์ชันและกำหนดค่าที่ส่งคืนให้กับตัวแปรได้ #include <iostream> #include <memory> using namespace std; unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // 1 //return move( p ); // 2 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; } รหัสข้างต้นรวบรวมและทำงานตามที่ตั้งใจไว้ ดังนั้นบรรทัด1นั้นจะไม่เรียกใช้ตัวสร้างการคัดลอกและทำให้เกิดข้อผิดพลาดของคอมไพเลอร์อย่างไร ถ้าฉันต้องใช้ไลน์2แทนมันก็สมเหตุสมผลดี (การใช้2งานไลน์ก็เช่นกัน แต่เราไม่จำเป็นต้องทำเช่นนั้น) ฉันรู้ว่า …
367 c++  c++11  unique-ptr 

5
รวบรวม C ++ 11 ด้วย g ++
ฉันพยายามอัปเดตคอมไพเลอร์ C ++ เป็น C ++ 11 ฉันค้นหาเล็กน้อยและได้ข้อสรุปว่าฉันต้องใช้ธง-std=c++0xหรือ-std=gnu++0xแต่ฉันไม่รู้อะไรเกี่ยวกับธงหลายอย่าง มีใครช่วยฉันบ้าง (ฉันใช้ Ubuntu 12.04) นี่คือข้อผิดพลาดที่ฉันได้รับจากคอมไพเลอร์เมื่อฉันพยายามใช้ไลบรารี่ซึ่งรวมอยู่ใน C ++ 11 (เช่นอาร์เรย์): #include <array> #include <iostream> int main() { std::array<int, 3> arr = {2, 3, 5}; ... } ไฟล์นี้ต้องการคอมไพเลอร์และการสนับสนุนไลบรารีสำหรับมาตรฐาน ISO C ++ ที่จะมาถึง C ++ 0x ขณะนี้การสนับสนุนนี้อยู่ระหว่างการทดลองและต้องเปิดใช้งานด้วยตัวเลือกคอมไพเลอร์ -std = c ++ 0x หรือ -std = …
367 c++  c++11  g++  flags 

14
ฉันจะเปิดใช้งาน C ++ 11 ใน CMake ได้อย่างไร
เมื่อฉันพยายามเรียกใช้ makefile ที่สร้างโดย CMake เพื่อรวบรวมโปรแกรมของฉันฉันได้รับข้อผิดพลาดนั้น ไม่รองรับช่วงสำหรับลูปในโหมด C ++ 98 ฉันพยายามเพิ่มadd_definitions(-std=c++0x)ในของฉันCMakeLists.txtแต่มันก็ไม่ได้ช่วย ฉันลองสิ่งนี้ด้วย: if(CMAKE_COMPILER_IS_GNUCXX) add_definitions(-std=gnu++0x) endif() เมื่อฉันทำg++ --versionฉันจะได้รับ: g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1 ฉันได้ลองSET(CMAKE_CXX_FLAGS "-std=c++0x")แล้วซึ่งยังใช้งานไม่ได้ ฉันไม่เข้าใจวิธีการเปิดใช้งานคุณสมบัติ C ++ 11 โดยใช้ CMake
356 c++11  cmake 

6
std :: unique_lock <std :: mutex> หรือ std :: lock_guard <std :: mutex>?
ตั้งค่าใหม่ให้กับStack Overflow ที่ใช้งานอยู่ : Чем std :: unique_lock отличаетсяот std :: lock_guard? ฉันมีสองกรณีใช้ A. ฉันต้องการซิงโครไนซ์การเข้าถึงโดยสองเธรดกับคิว B. ฉันต้องการซิงโครไนซ์การเข้าถึงโดยสองเธรดกับคิวและใช้ตัวแปรเงื่อนไขเพราะหนึ่งในเธรดจะรอเนื้อหาที่จะเก็บไว้ในคิวโดยเธรดอื่น สำหรับกรณีที่ใช้ AI std::lock_guard&lt;&gt;ดูตัวอย่างการใช้รหัส สำหรับกรณีการใช้งาน BI std::unique_lock&lt;&gt;ดูตัวอย่างการใช้รหัส อะไรคือความแตกต่างระหว่างทั้งสองกับสิ่งที่ฉันควรใช้ในกรณีที่ใช้?

14
เมื่อใดที่คุณควรใช้ความสามารถของ constexpr ใน C ++ 11
ดูเหมือนว่าสำหรับฉันแล้วการมี "ฟังก์ชั่นที่ส่งกลับค่า 5" จะทำลายหรือทำให้ความหมายของ "การเรียกใช้ฟังก์ชัน" ลดลง ต้องมีเหตุผลหรือต้องการความสามารถนี้มิเช่นนั้นจะไม่อยู่ใน C ++ 11 ทำไมถึงอยู่ที่นั่น? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } สำหรับฉันดูเหมือนว่าถ้าฉันเขียนฟังก์ชันที่ส่งคืนค่าตามตัวอักษรและฉันได้รับการตรวจสอบโค้ดใครบางคนจะบอกฉันฉันก็ควรจะประกาศค่าคงที่แทนการเขียนส่งคืน 5
337 c++  c++11  constexpr 

5
จะใช้ range-based สำหรับ () loop กับ std :: map ได้อย่างไร?
ตัวอย่างทั่วไปสำหรับลูป C ++ 11 ที่ใช้สำหรับ () เป็นบางสิ่งที่ง่ายเช่นนี้เสมอ: std::vector&lt;int&gt; numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout &lt;&lt; xyz &lt;&lt; std::endl; } ซึ่งในกรณีที่เป็นxyz intแต่จะเกิดอะไรขึ้นเมื่อเรามีบางอย่างที่เหมือนแผนที่ ชนิดของตัวแปรในตัวอย่างนี้คืออะไร: std::map&lt; foo, bar &gt; testing = { /*...blah...*/ }; for ( auto abc : …

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