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

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

4
วิธีการเรียกตัวสร้างที่ถูกต้องของประเภทแม่แบบ?
ในรหัสต่อไปนี้ฉันจะทำให้บรรทัดที่มีความคิดเห็นทำงานในลักษณะเดียวกับบรรทัดที่อยู่เหนือบรรทัดได้อย่างไร Typeผมอยากจะทำให้มันเป็นโค้ดทั่วไปที่โทรคอนสตรัคที่เหมาะสมของแม่แบบ #include <string> #include <iostream> template <typename Type> struct Class { Type data; Class(Type data) : data(data) { } }; int main() { Class<std::string> a = std::string("abc"); // Class<std::string> b = "abc"; std::cout << a.data << std::endl; return 0; }

4
enum C ++ ต่อเนื่อง 11
มีวิธีการเช็คอินใน C ++ 11 ไหมถ้า enum ต่อเนื่องหรือไม่? มันถูกต้องอย่างสมบูรณ์เพื่อให้ค่า enum ที่ไม่ได้ อาจมีคุณสมบัติเช่นลักษณะประเภทใน C ++ 14, C ++ 17 หรืออาจ C ++ 20 เพื่อตรวจสอบว่า enum เป็นแบบต่อเนื่องหรือไม่ สิ่งนี้จะใช้ใน static_assert ตัวอย่างเล็ก ๆ ดังนี้: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, …
17 c++  c++11  c++14  c++17  c++20 

2
นี่เป็นตัวสร้างลักษณะ C ++ เก่าหรือไม่
นี่คือโค้ด C ++ ในตัวอย่างนี้บล็อคโค้ดจำนวนมากมีลักษณะเหมือนการเรียกคอนสตรัคเตอร์ น่าเสียดายที่รหัสบล็อก # 3 ไม่ใช่ (คุณสามารถตรวจสอบได้โดยใช้https://godbolt.org/z/q3rsxnและhttps://cppinsights.io ) ฉันคิดว่ามันเป็นสัญกรณ์ C ++ เก่าและสามารถอธิบายการแนะนำของสัญกรณ์การก่อสร้าง C ++ 11 ใหม่โดยใช้ {} (cf # 4) คุณมีคำอธิบายสำหรับT(i)ความหมายใกล้กับสัญกรณ์คอนสตรัคชัน แต่แตกต่างกันอย่างแน่นอน? struct T { T() { } T(int i) { } }; int main() { int i = 42; { // #1 T t(i); // new T …
17 c++  c++11 

3
เทมเพลต Variadic: เปิดเผยอาร์กิวเมนต์ในกลุ่ม
ฉันมีฟังก์ชั่นที่รับสองอาร์กิวเมนต์: template <typename T1, typename T2> void foo(T1 arg1, T2 arg2) { std::cout << arg1 << " + " << arg2 << '\n'; } และอีกหนึ่งตัวแปรที่ควรส่งต่อข้อโต้แย้งเป็นคู่: template <typename... Args> void bar(Args&&... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... ); // ^ Sends each argument twice, …

2
ทำไม std :: swap ที่ทำเครื่องหมายว่า constexpr ก่อน C ++ 20 ไม่
ใน C ++ 20 std::swapกลายเป็นconstexprฟังก์ชัน ฉันรู้ว่าห้องสมุดมาตรฐานล้าหลังภาษาในการทำเครื่องหมายสิ่งต่าง ๆconstexprแต่ในปี 2560 <algorithm>เป็นกลุ่มคนที่ค่อนข้างมากเหมือนกับสิ่งอื่น ๆ แต่ - std::swapไม่ใช่ ฉันจำได้ว่ามีข้อบกพร่องบางอย่างเกี่ยวกับภาษาแปลก ๆ ซึ่งป้องกันการทำเครื่องหมายนั้น แต่ฉันลืมรายละเอียด บางคนสามารถอธิบายสิ่งนี้อย่างกระชับและชัดเจน? แรงจูงใจ: จำเป็นต้องเข้าใจว่าเหตุใดจึงเป็นความคิดที่ไม่ดีที่จะทำเครื่องหมายstd::swap()ฟังก์ชันเหมือนconstexprในรหัส C ++ 11 / C ++ 14

3
การเรียงลำดับเวกเตอร์ตามลำดับจากมากไปน้อยภายในสองช่วง
ว่าฉันมีเวกเตอร์จำนวนเต็ม: std::vector<int> indices; for (int i=0; i<15; i++) indices.push_back(i); จากนั้นฉันเรียงตามลำดับจากมากไปน้อย: sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];}) for (int i=0; i<15; i++) printf("%i\n", indices[i]); สิ่งนี้สร้างสิ่งต่อไปนี้: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ตอนนี้ฉันต้องการให้หมายเลข 3, 4, 5 และ 6 …

1
ฉันสามารถ list-initialize std :: vector พร้อมการส่งต่อองค์ประกอบที่สมบูรณ์ได้หรือไม่?
ฉันสังเกตเห็นว่ารายการรวม initalization ของ std :: vector ดำเนินการเริ่มต้นการคัดลอกเมื่อย้ายจะใช้งานได้มากขึ้น ในเวลาเดียวกันหลาย emplace_backs ทำสิ่งที่ฉันต้องการ init_emplace_vectorฉันเท่านั้นที่สามารถเกิดขึ้นกับวิธีการแก้ปัญหาที่ไม่สมบูรณ์ของการเขียนฟังก์ชั่นแม่แบบ มันเป็นสิ่งที่ดีที่สุดสำหรับตัวสร้างค่าเดียวที่ไม่ชัดเจน template <typename T, typename... Args> std::vector<T> init_emplace_vector(Args&&... args) { std::vector<T> vec; vec.reserve(sizeof...(Args)); // by suggestion from user: eerorika (vec.emplace_back(std::forward<Args>(args)), ...); // C++17 return vec; } คำถาม ฉันจำเป็นต้องใช้ emplace_backเพื่อเริ่มต้น std :: vector ให้มีประสิทธิภาพมากที่สุดหรือไม่ // an integer passed to large …

3
เหตุใดส่วนมิติของอาร์เรย์จึงเป็นชนิดข้อมูล
ในขณะที่อ่านหนังสือ C ++ Primer ฉันเจอข้อความนี้: "จำนวนองค์ประกอบในอาเรย์เป็นส่วนหนึ่งของประเภทอาเรย์" ดังนั้นฉันต้องการค้นหาโดยใช้รหัสต่อไปนี้: #include<iostream> int main() { char Array1[]{'H', 'e', 'l', 'p'}; char Array2[]{'P', 'l', 'e', 'a', 's', 'e'}; std::cout<<typeid(Array1).name()<<std::endl; //prints A4_c std::cout<<typeid(Array2).name()<<std::endl; //prints A6_c return 0; } และน่าสนใจที่ผลลัพธ์ของ typeid ในสองอาร์เรย์แสดงว่ามันแตกต่างกัน เบื้องหลังเกิดอะไรขึ้น เหตุใดจึงจำเป็นต้องให้อาร์เรย์มีชนิดที่มีขนาด เป็นเพราะขนาดไม่ควรเปลี่ยนแปลงหรือไม่ สิ่งนี้จะส่งผลกระทบต่อการเปรียบเทียบอาร์เรย์? เพียงแค่ต้องการที่จะสามารถเข้าใจแนวคิดอย่างลึกซึ้ง
14 c++  arrays  c++11 

3
ดำเนินการฟังก์ชันภายในเทมเพลตฟังก์ชันเฉพาะสำหรับประเภทที่มีฟังก์ชันกำหนดไว้เท่านั้น
ฉันมีเทมเพลตฟังก์ชั่นที่ใช้หลายประเภทเนื่องจากอินพุต มีเพียงหนึ่งประเภทเท่านั้นที่มีgetInt()ฟังก์ชัน ดังนั้นฉันต้องการรหัสเพื่อเรียกใช้ฟังก์ชันเฉพาะสำหรับประเภทนั้น กรุณาแนะนำวิธีแก้ปัญหา ขอบคุณ #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want …

4
คำอธิบายของการสั่งซื้อที่ผ่อนคลายผิดพลาดใน cppreference หรือไม่?
ในเอกสารประกอบของstd::memory_orderบน cppreference.comมีตัวอย่างของการสั่งซื้อแบบผ่อนคลาย: สั่งผ่อนคลาย การดำเนินการของอะตอมมิกที่ติดแท็กmemory_order_relaxedไม่ใช่การดำเนินการทำข้อมูลให้ตรงกัน พวกเขาไม่ได้กำหนดลำดับการเข้าถึงหน่วยความจำพร้อมกัน พวกเขารับประกันเฉพาะอะตอมมิกและความสอดคล้องของคำสั่งแก้ไข ตัวอย่างเช่นเมื่อ x และ y เริ่มต้นที่ศูนย์ // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D ได้รับอนุญาตให้สร้าง r1 == r2 == 42 เพราะถึงแม้ว่า A จะถูกจัดลำดับก่อนหน้า B ภายในเธรด 1 และ C ถูกเรียงตามลำดับก่อนหน้า …

1
ข้อผิดพลาดของคอมไพเลอร์ที่เป็นไปได้ใน MSVC
โค้ดต่อไปนี้คอมไพล์ด้วย gcc และ clang (และคอมไพเลอร์ C ++ 11 อื่น ๆ อีกมากมาย) #include <stdint.h> typedef int datatype; template <typename T> struct to_datatype {}; template <> struct to_datatype<int16_t> { static constexpr datatype value = 1; }; template <typename T> class data { public: data(datatype dt = to_datatype<T>::value) {} }; int main() { …
13 c++  c++11  visual-c++ 

1
ทำไมประเภทนิพจน์จึงเปลี่ยนเป็น C ++ ระหว่างเวอร์ชัน?
ฉันพยายามที่จะเข้าใจประเภทการแสดงออกของ C ++ และยิ่งฉันอ่านยิ่งฉันสับสนมากขึ้นเนื่องจากฉันพบว่า C ++ ร่างยากมากที่จะแยกย่อยและดังนั้นจึงชอบแหล่งข้อมูลอื่น แต่พวกเขาขัดแย้งกันหรือไม่คำนึงว่า ถ้อยคำและคำจำกัดความระหว่างเวอร์ชัน C ++ มีการเปลี่ยนแปลงอย่างมาก ในต่อไปนี้ฉันหมายถึงร่างต่อไปนี้: C ++ 11 [ n3690 ] (ร่างสุดท้าย) C ++ 17 [ n4659 ] (ร่างสุดท้าย) C ++ 20 [ n4835 ] (ร่างปัจจุบัน) C++11 3.10 ค่าและค่า ... prvalue (“ pure” rvalue) คือ rvalue ที่ไม่ใช่ xvalue [ตัวอย่าง: ผลลัพธ์ของการเรียกฟังก์ชั่นที่มีประเภทส่งคืนไม่ใช่การอ้างอิงคือ prvalue ค่าของตัวอักษรเช่น …
13 c++  c++11  c++14  c++17  c++20 

2
เหตุใดตัวแปร enum จึงเป็นค่าที่นี่
ตัวอย่าง: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันรวบรวมสิ่งนี้: <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type …

3
ความแตกต่างระหว่าง std :: resize (n) และ std :: shrink_to_fit ใน C ++?
ฉันเจอข้อความเหล่านี้: resize(n)- ปรับขนาดภาชนะเพื่อให้มีองค์ประกอบ 'n' shrink_to_fit()- ลดความจุของภาชนะบรรจุให้พอดีกับขนาดและทำลายส่วนประกอบทั้งหมดเกินความจุ มีความแตกต่างที่สำคัญระหว่างฟังก์ชั่นเหล่านี้หรือไม่? พวกมันมาอยู่ใต้เวกเตอร์ใน c ++

3
จะทราบได้อย่างไรว่าคอมไพเลอร์ตัวใดที่สร้างขึ้น?
ฉันรู้เกี่ยวกับฟังก์ชันที่คอมไพเลอร์สร้างขึ้น, กฎของสามและกฎห้า ในสถานการณ์โลกแห่งความจริงมันอาจไม่สำคัญที่จะเข้าใจว่าฟังก์ชั่นที่สร้างขึ้นโดยคอมไพเลอร์ (ผู้สร้างผู้ประกอบการที่ได้รับมอบหมายผู้ทำลายล้าง) ถูกสร้างขึ้นจริงโดยคอมไพเลอร์ มีวิธีใดบ้างในการแสดงรายการฟังก์ชันที่คอมไพเลอร์สร้างขึ้นสำหรับคลาสที่ระบุ? ฉันสนใจ Visual Studio 2019 และ Xcode เป็นหลัก แต่โซลูชันทั่วไปน่ายินดียิ่งกว่าเดิม
11 c++  c++11 

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