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

C ++ 14 เป็นชื่อของมาตรฐาน C ++ ซึ่งได้รับการอนุมัติในปี 2014 โดยสร้างขึ้นจากมาตรฐาน C ++ 11 ก่อนหน้าปรับปรุงภาษาหลักและไลบรารีมาตรฐานและเพิ่มคุณสมบัติบางอย่าง

4
ความต้องการของเทมเพลตแลมด้าที่นำมาใช้ใน C ++ 20 คืออะไรเมื่อ C ++ 14 มีแลมด้าทั่วไปอยู่แล้ว
c ++ 14 แนะนำ lambdas ทั่วไปที่ทำให้สามารถเขียนต่อไปนี้: auto func = [](auto a, auto b){ return a + b; }; auto Foo = func(2, 5); auto Bar = func("hello", "world"); เป็นที่ชัดเจนมากว่าแลมบ์ดาทั่วไปนี้funcทำงานได้เหมือนกับฟังก์ชันเทมเพลตfuncจะทำงานได้ เหตุใดคณะกรรมการ C ++ จึงตัดสินใจเพิ่มไวยากรณ์เทมเพลตสำหรับ Lamda ทั่วไป

6
ข้อผิดพลาด :: make_unique ไม่ใช่สมาชิกของ 'std'
ฉันกำลังพยายามรวบรวมโปรแกรมเธรดพูลต่อไปนี้ที่โพสต์ในการตรวจสอบโค้ดเพื่อทดสอบ /codereview/55100/platform-independant-thread-pool-v4 แต่ฉันได้รับข้อผิดพลาด threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’: threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise)); ^ threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise)); ^ main.cpp: In function ‘int main()’: main.cpp:9:17: error: …

5
ทำไมแลมบ์ดาถึงมีขนาด 1 ไบต์?
ฉันกำลังทำงานกับหน่วยความจำของ lambdas บางตัวใน C ++ แต่ฉันงงกับขนาดของมันเล็กน้อย นี่คือรหัสทดสอบของฉัน: #include <iostream> #include <string> int main() { auto f = [](){ return 17; }; std::cout << f() << std::endl; std::cout << &f << std::endl; std::cout << sizeof(f) << std::endl; } คุณสามารถเรียกใช้ได้ที่นี่: http://fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598 ouptut คือ: 17 0x7d90ba8f626f 1 นี่แสดงให้เห็นว่าขนาดของแลมด้าของฉันคือ 1 เป็นไปได้อย่างไร? อย่างน้อยแลมด้าไม่ควรเป็นตัวชี้การนำไปใช้งานหรือไม่?
90 c++  c++11  lambda  c++14  sizeof 

3
const void คืออะไร?
คำอธิบายของstd::is_voidระบุว่า: ระบุค่าคงที่ของสมาชิกที่เท่ากับจริงถ้า T เป็นประเภทโมฆะ const โมฆะโมฆะระเหยหรือ const โมฆะระเหย แล้วจะconst voidเป็นvolatile voidอย่างไรหรือก. คำตอบนี้ระบุว่าconst voidประเภทการส่งคืนจะไม่ถูกต้อง (อย่างไรก็ตามคอมไพล์ใน VC ++ 2015) const void foo() { } ถ้าตามมาตรฐานแล้วconst voidไม่ถูกต้อง (VC ผิด) - แล้วคือconst voidอะไร?
90 c++  c++11  c++14 

2
วัตถุประสงค์ของการใช้สหภาพกับสมาชิกเพียงคนเดียวคืออะไร?
เมื่อฉันอ่านซอร์สโค้ด seastarฉันสังเกตเห็นว่ามีโครงสร้างแบบสหภาพที่เรียกว่าtx_sideมีสมาชิกเพียงคนเดียว แฮ็คนี้จะจัดการกับปัญหาบางอย่างหรือไม่? FYI ฉันวางtx_sideโครงสร้างด้านล่าง: union tx_side { tx_side() {} ~tx_side() {} void init() { new (&a) aa; } struct aa { std::deque<work_item*> pending_fifo; } a; } _tx;
89 c++  c++14  unions 

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
วิธีรับแอดเดรสของฟังก์ชันแลมบ์ดา C ++ ภายในแลมบ์ดาเองได้อย่างไร
ฉันกำลังพยายามหาวิธีรับที่อยู่ของฟังก์ชันแลมบ์ดาภายในตัวเอง นี่คือตัวอย่างรหัส: []() { std::cout << "Address of this lambda function is => " << ???? }(); ฉันรู้ว่าฉันสามารถจับแลมบ์ดาในตัวแปรและพิมพ์ที่อยู่ได้ แต่ฉันต้องการทำสิ่งนี้เมื่อฟังก์ชันที่ไม่ระบุตัวตนกำลังดำเนินการ มีวิธีที่ง่ายกว่านี้หรือไม่?
53 c++  c++11  lambda  c++14  c++17 

1
เหตุใด std :: atomic constructor จึงมีความแตกต่างใน C ++ 14 และ C ++ 17
ฉันทำงานในโครงการที่มี C ++ 11 และฉันลองใช้รหัสต่อไปนี้ #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } ฉันได้รับข้อผิดพลาดของคอมไพเลอร์ error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ ผลลัพธ์เดียวกันคือกับ C ++ 14 เมื่อฉันเปลี่ยนเป็น C ++ 17 มันใช้งานได้: wandbox ฉันตรวจสอบความแตกต่างของ cppreference: …
19 c++  c++14  c++17  stdatomic 

3
ค่าปิดของแลมบ์ดาสามารถส่งผ่านเป็นพารามิเตอร์อ้างอิง rvalue ได้
ฉันพบว่าการlvalueปิดแลมบ์ดาสามารถส่งผ่านเป็นrvalueพารามิเตอร์ฟังก์ชันได้เสมอ ดูการสาธิตง่ายๆดังต่อไปนี้ #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error 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 

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 …

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 

1
เทมเพลตตัวแปรสามารถส่งผ่านเป็นอาร์กิวเมนต์เท็มเพลตเทมเพลตได้หรือไม่
ตัวอย่างที่ไร้สาระดังต่อไปนี้ไม่ได้รวบรวม แต่มีวิธีอื่นในการส่งแม่แบบตัวแปรเป็นอาร์กิวเมนต์แม่แบบแม่แบบหรือไม่ template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } ลองใช้ Compiler Explorer

1
เหตุใดจึงไม่สามารถใช้ช่วงสำหรับการทำงานของไลบรารีของไพพ์
โจนาธาน Boccara (ผู้เขียนเหมือนเจ้าของภาษา C ++ ) เขียนห้องสมุดที่เรียกว่าท่อ "piping" หน้าหลักของที่เก็บกล่าวว่าไม่เหมือนกับการใช้ช่วงแม้ว่ามันจะดูเหมือนกัน: มันไม่ได้ขึ้นอยู่กับการดึงแบบขี้เกียจ แต่อยากที่จะผลักดัน แต่มันระบุไว้ว่าเราไม่สามารถใช้ไลบรารีช่วงเพื่อดำเนินการ 'ไปป์' ที่หลากหลาย ตัวอย่างเช่น: เปิดเครื่องรูด - รับอินพุตซิป - ช่วงของ k-tuples เป็นหลัก - และสร้างเอาต์พุตแยกอิสระ k fork - สร้างสำเนาของคอนเทนเนอร์ / พิสัยหลายชุด (อิสระ) ฉันไม่เข้าใจว่าทำไมในหลักการแล้วเป็นกรณีนี้ (แน่นอนว่ามีข้อยกเว้นของช่วงที่คุณไม่สามารถรับตัววนซ้ำสุดท้าย / Sentinel ได้)

2
วิธีการคัดลอกเมื่อผูกมัด?
ฉันกำลังสร้างคลาสของการผูกมัดประเภทเช่นตัวอย่างเล็ก ๆ ด้านล่าง ดูเหมือนว่าเมื่อการเชื่อมโยงสมาชิกฟังก์ชันแล้วตัวสร้างการคัดลอกจะถูกเรียกใช้ มีวิธีกำจัด call constructor ของการคัดลอกหรือไม่? ในตัวอย่างของเล่นของฉันด้านล่างเป็นที่ชัดเจนว่าฉันกำลังจัดการกับขมับเท่านั้นและดังนั้นจึงมี "ควร" (อาจไม่ได้ตามมาตรฐาน ตัวเลือกที่ดีที่สุดอันดับที่สองคือการคัดลอกตัวเลือกจะเป็นตัวสร้างการย้ายที่จะถูกเรียก แต่ไม่ใช่ในกรณีนี้ class test_class { private: int i = 5; public: test_class(int i) : i(i) {} test_class(const test_class& t) { i = t.i; std::cout << "Copy constructor"<< std::endl; } test_class(test_class&& t) { i = t.i; std::cout << "Move constructor"<< …
10 c++  c++14  c++17 

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