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

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

3
วิธีสร้าง typedef ตามเงื่อนไขใน C ++
ฉันกำลังพยายามทำสิ่งนี้: #include <iostream> #include <random> typedef int Integer; #if sizeof(Integer) <= 4 typedef std::mt19937 Engine; #else typedef std::mt19937_64 Engine; #endif int main() { std::cout << sizeof(Integer) << std::endl; return 0; } แต่ฉันได้รับข้อผิดพลาดนี้: error: missing binary operator before token "(" ฉันจะทำให้พิมพ์ดีดตามเงื่อนไขถูกต้องได้อย่างไร
90 c++  c++11 

2
เกิดข้อผิดพลาดเมื่อใช้การเตรียมใช้งานในคลาสของสมาชิกข้อมูลที่ไม่คงที่และตัวสร้างคลาสที่ซ้อนกัน
โค้ดต่อไปนี้ค่อนข้างไม่สำคัญและฉันคาดว่ามันควรจะคอมไพล์ได้ดี struct A { struct B { int i = 0; }; B b; A(const B& _b = B()) : b(_b) {} }; ฉันได้ทดสอบโค้ดนี้กับ g ++ เวอร์ชัน 4.7.2, 4.8.1, clang ++ 3.2 และ 3.3 นอกเหนือจากข้อเท็จจริงที่ว่า g ++ 4.7.2 segfaults ในโค้ดนี้ ( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770 ) คอมไพเลอร์ที่ผ่านการทดสอบอื่น ๆ ยังให้ข้อความแสดงข้อผิดพลาดที่ไม่ได้อธิบายอะไรมาก g ++ 4.8.1: test.cpp: …

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 

6
ฟังก์ชันที่ส่งคืนนิพจน์แลมบ์ดา
ฉันสงสัยว่าเป็นไปได้ไหมที่จะเขียนฟังก์ชันที่ส่งคืนฟังก์ชันแลมบ์ดาใน C ++ 11 แน่นอนปัญหาหนึ่งคือวิธีการประกาศฟังก์ชันดังกล่าว แลมบ์ดาแต่ละตัวมีประเภท แต่ประเภทนั้นไม่สามารถแสดงออกได้ใน C ++ ฉันไม่คิดว่าจะได้ผล: auto retFun() -> decltype ([](int x) -> int) { return [](int x) { return x; } } ไม่ใช่สิ่งนี้: int(int) retFun(); ฉันไม่ทราบถึงการแปลงอัตโนมัติใด ๆ จาก lambdas เป็นพูดชี้ไปยังฟังก์ชันหรือบางอย่าง วิธีแก้ปัญหาเดียวคือการประดิษฐ์วัตถุฟังก์ชันและส่งคืนหรือไม่?
90 c++  function  c++11  lambda 

6
เหตุใดฉันจึงไม่สามารถสร้างเวกเตอร์ของ lambdas (ชนิดเดียวกัน) ใน C ++ 11 ได้
ฉันพยายามสร้างเวกเตอร์แลมด้า แต่ล้มเหลว: auto ignore = [&]() { return 10; }; //1 std::vector<decltype(ignore)> v; //2 v.push_back([&]() { return 100; }); //3 ขึ้นกับสาย # 2 ก็รวบรวมดี แต่บรรทัด # 3 ให้ข้อผิดพลาดในการคอมไพล์ : ข้อผิดพลาด: ไม่มีฟังก์ชันที่ตรงกันสำหรับการเรียกไปที่ 'std :: vector <main () :: <lambda () >> :: push_back (main () :: <lambda ()>)' ฉันไม่ต้องการเวกเตอร์ของตัวชี้ฟังก์ชันหรือเวกเตอร์ของวัตถุฟังก์ชัน อย่างไรก็ตามเวกเตอร์ของวัตถุฟังก์ชันที่ห่อหุ้มนิพจน์แลมบ์ดาจริงจะใช้ได้สำหรับฉัน เป็นไปได้หรือไม่
90 c++  vector  lambda  c++11 

5
มี std :: shared_ptr ที่ไม่ใช่อะตอมหรือไม่ แล้วทำไมไม่มีใน <memory>?
นี่เป็นคำถามสองส่วนเกี่ยวกับปรมาณูของstd::shared_ptr: 1. เท่าที่ฉันสามารถบอกได้std::shared_ptrคือตัวชี้อัจฉริยะเพียงตัวเดียวใน&lt;memory&gt;อะตอมนั้น ฉันสงสัยว่ามีเวอร์ชันที่ไม่ใช่อะตอมหรือไม่std::shared_ptr(ฉันมองไม่เห็นอะไรเลย&lt;memory&gt;ดังนั้นฉันจึงเปิดรับข้อเสนอแนะที่อยู่นอกเหนือจากมาตรฐานเช่นใน Boost) ฉันรู้ว่าboost::shared_ptrเป็นปรมาณู (ถ้าBOOST_SP_DISABLE_THREADSไม่ได้กำหนดไว้) แต่อาจมีทางเลือกอื่น? ฉันกำลังมองหาสิ่งที่มีความหมายเหมือนstd::shared_ptrกัน แต่ไม่มีความเป็นอะตอม 2.ฉันเข้าใจว่าทำไมstd::shared_ptrอะตอม; มันก็ดีนะ อย่างไรก็ตามมันไม่ดีสำหรับทุกสถานการณ์และในอดีต C ++ มีมนต์ตราว่า "จ่ายเฉพาะสิ่งที่คุณใช้เท่านั้น" ถ้าฉันไม่ได้ใช้เธรดหลายเธรดหรือฉันกำลังใช้เธรดหลายเธรด แต่ฉันไม่ได้แชร์ความเป็นเจ้าของพอยน์เตอร์ข้ามเธรดตัวชี้สมาร์ทอะตอมจะมากเกินไป คำถามที่สองของฉันคือเหตุผลที่ไม่ได้เป็นรุ่นที่ไม่ใช่ของอะตอมstd::shared_ptrที่ระบุไว้ใน C ++ 11 ? (สมมติว่ามีสาเหตุ ) (หากคำตอบคือ "เวอร์ชันที่ไม่ใช่อะตอมก็ไม่เคยพิจารณา" หรือ "ไม่เคยมีใครขอเวอร์ชันที่ไม่ใช่อะตอม" ก็ไม่เป็นไร!) สำหรับคำถาม # 2 ฉันสงสัยว่ามีใครเคยเสนอรุ่นที่ไม่ใช่อะตอมของshared_ptr(ไม่ว่าจะเป็น Boost หรือคณะกรรมการมาตรฐาน) (ไม่ใช่เพื่อแทนที่รุ่นอะตอมshared_ptrแต่จะอยู่ร่วมกับมัน) และมันถูกยิงลงสำหรับ เหตุผลเฉพาะ

4
เหตุใดจึงไม่มีการกำหนดค่าการย้าย / ย้ายตัวสร้างเริ่มต้น
ฉันเป็นโปรแกรมเมอร์ธรรมดา ๆ ตัวแปรสมาชิกชั้นเรียนของฉันส่วนใหญ่มักประกอบด้วยประเภท POD และ STL-container ด้วยเหตุนี้ฉันจึงแทบไม่ต้องเขียนตัวดำเนินการกำหนดหรือคัดลอกตัวสร้างเนื่องจากจะใช้งานโดยค่าเริ่มต้น เพิ่มสิ่งนี้ถ้าฉันใช้std::moveกับวัตถุที่ไม่สามารถเคลื่อนย้ายได้มันจะใช้ตัวดำเนินการกำหนดหมายความว่าstd::moveปลอดภัยอย่างสมบูรณ์ เนื่องจากฉันเป็นโปรแกรมเมอร์ธรรมดาฉันจึงต้องการใช้ประโยชน์จากความสามารถในการย้ายโดยไม่ต้องเพิ่มตัวสร้างการย้าย / ตัวดำเนินการกำหนดให้กับทุกชั้นเรียนที่ฉันเขียนเนื่องจากคอมไพเลอร์สามารถนำไปใช้เป็น " this-&gt;member1_ = std::move(other.member1_);..." แต่มันไม่มี (อย่างน้อยก็ไม่ใช่ใน Visual 2010) มีเหตุผลพิเศษสำหรับสิ่งนี้หรือไม่? ที่สำคัญกว่า; มีวิธีใดบ้างที่จะหลีกเลี่ยงสิ่งนี้? อัปเดต: หากคุณมองลงไปที่คำตอบของ GManNickG เขาให้มาโครที่ยอดเยี่ยมสำหรับสิ่งนี้ และหากคุณไม่ทราบหากคุณใช้การย้ายความหมายคุณสามารถลบฟังก์ชัน swap member ได้

3
นี่เป็นข้อผิดพลาดที่ทราบของ C ++ 11 สำหรับลูปหรือไม่?
สมมติว่าเรามีโครงสร้างสำหรับการถือครอง 3 คู่พร้อมฟังก์ชันสมาชิกบางอย่าง: struct Vector { double x, y, z; // ... Vector &amp;negate() { x = -x; y = -y; z = -z; return *this; } Vector &amp;normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // ... }; นี่เป็นเพียงเล็กน้อยที่ออกแบบมาเพื่อความเรียบง่าย …

7
ตอนนี้เรามี std :: array แล้วสิ่งที่ใช้สำหรับอาร์เรย์สไตล์ C คืออะไร?
std::arrayเหนือกว่าอาร์เรย์ C อย่างมาก และแม้ว่าฉันต้องการทำงานร่วมกับรหัสเดิมฉันก็สามารถstd::array::data()ใช้ได้ มีเหตุผลใดบ้างที่ฉันต้องการอาร์เรย์แบบเก่า?

3
การเลิกใช้งานคำหลักคงที่ ... ไม่มีอีกแล้วหรือ
ใน C ++ เป็นไปได้ที่จะใช้staticคีย์เวิร์ดภายในหน่วยการแปลเพื่อส่งผลต่อการแสดงสัญลักษณ์ (ไม่ว่าจะเป็นการประกาศตัวแปรหรือฟังก์ชัน) ใน n3092 สิ่งนี้เลิกใช้แล้ว: ภาคผนวก D.2 [depr.static] การใช้คีย์เวิร์ดแบบคงที่จะเลิกใช้เมื่อประกาศอ็อบเจ็กต์ในขอบเขตเนมสเปซ (ดู 3.3.6) ใน n3225 สิ่งนี้ถูกลบออก บทความเดียวที่ฉันจะหาค่อนข้างเป็นทางการ แม้ว่าจะขีดเส้นใต้ว่าสำหรับความเข้ากันได้กับ C (และความสามารถในการคอมไพล์โปรแกรม C เป็น C ++) การเลิกใช้งานนั้นน่ารำคาญ อย่างไรก็ตามการรวบรวมโปรแกรม C โดยตรงเนื่องจาก C ++ อาจเป็นประสบการณ์ที่น่าหงุดหงิดอยู่แล้วดังนั้นฉันจึงไม่แน่ใจว่าควรพิจารณาหรือไม่ มีใครรู้บ้างว่าทำไมถึงเปลี่ยน?
89 c++  static  c++11  standards 

4
วิธีจัดเก็บอาร์กิวเมนต์แม่แบบตัวแปร
เป็นไปได้ไหมที่จะจัดเก็บชุดพารามิเตอร์เพื่อใช้ในภายหลัง? template &lt;typename... T&gt; class Action { private: std::function&lt;void(T...)&gt; f; T... args; // &lt;--- something like this public: Action(std::function&lt;void(T...)&gt; f, T... args) : f(f), args(args) {} void act(){ f(args); // &lt;--- such that this will be possible } } จากนั้นในภายหลัง: void main(){ Action&lt;int,int&gt; add([](int x, int y){std::cout &lt;&lt; (x+y);}, 3, …

3
C ++ 11 ช่วยให้สามารถเริ่มต้นในคลาสของสมาชิกที่ไม่คงที่และไม่ใช่ const อะไรเปลี่ยนไป?
ก่อน C ++ 11 เราสามารถดำเนินการเริ่มต้นในคลาสเฉพาะกับสมาชิก const คงที่ของประเภทอินทิกรัลหรือการแจงนับ Stroustrup กล่าวถึงสิ่งนี้ในคำถามที่พบบ่อยเกี่ยวกับ C ++โดยให้ตัวอย่างต่อไปนี้: class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error: not integral }; และเหตุผลต่อไปนี้: เหตุใดจึงมีข้อ จำกัด ที่ไม่สะดวกเหล่านี้? โดยทั่วไปคลาสจะถูกประกาศในไฟล์ส่วนหัวและโดยทั่วไปไฟล์ส่วนหัวจะรวมอยู่ในหน่วยการแปลจำนวนมาก อย่างไรก็ตามเพื่อหลีกเลี่ยงกฎตัวเชื่อมโยงที่ซับซ้อน C …

8
C ++ 11 emplace_back บน vector <struct>?
พิจารณาโปรแกรมต่อไปนี้: #include &lt;string&gt; #include &lt;vector&gt; using namespace std; struct T { int a; double b; string c; }; vector&lt;T&gt; V; int main() { V.emplace_back(42, 3.14, "foo"); } มันไม่ทำงาน: $ g++ -std=gnu++11 ./test.cpp In file included from /usr/include/c++/4.7/x86_64-linux-gnu/bits/c++allocator.h:34:0, from /usr/include/c++/4.7/bits/allocator.h:48, from /usr/include/c++/4.7/string:43, from ./test.cpp:1: /usr/include/c++/4.7/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator&lt;_Tp&gt;::construct(_Up*, _Args&amp;&amp; …
89 c++  c++11 

11
สวย - พิมพ์ std :: tuple
นี่เป็นคำถามที่ตามมาจากคำถามก่อนหน้าของฉันเกี่ยวกับคอนเทนเนอร์ STL ที่มีการพิมพ์สวยซึ่งเราได้จัดการเพื่อพัฒนาโซลูชันที่หรูหราและใช้งานทั่วไป ในขั้นตอนต่อไปนี้ฉันต้องการรวมการพิมพ์ที่สวยงามสำหรับการstd::tuple&lt;Args...&gt;ใช้เทมเพลตตัวแปร (ดังนั้นนี่คือ C ++ 11 อย่างเคร่งครัด) สำหรับstd::pair&lt;S,T&gt;ฉันพูดง่ายๆ std::ostream &amp; operator&lt;&lt;(std::ostream &amp; o, const std::pair&lt;S,T&gt; &amp; p) { return o &lt;&lt; "(" &lt;&lt; p.first &lt;&lt; ", " &lt;&lt; p.second &lt;&lt; ")"; } โครงสร้างที่คล้ายคลึงกันสำหรับการพิมพ์ทูเพิลคืออะไร? ฉันได้ลองใช้การแยกสแต็กอาร์กิวเมนต์เทมเพลตหลายบิตส่งดัชนีไปรอบ ๆ และใช้ SFINAE เพื่อค้นหาว่าฉันอยู่ที่องค์ประกอบสุดท้าย แต่ไม่ประสบความสำเร็จ ฉันไม่เป็นภาระให้คุณด้วยรหัสที่เสียของฉัน หวังว่าคำอธิบายปัญหาจะตรงไปตรงมาเพียงพอ โดยพื้นฐานแล้วฉันต้องการพฤติกรรมต่อไปนี้: auto a = std::make_tuple(5, "Hello", -0.1); …

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