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

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

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

8
C ++ 11 reverse-based for-loop สำหรับช่วง
มีอะแดปเตอร์คอนเทนเนอร์ที่จะเปลี่ยนทิศทางของตัววนซ้ำเพื่อให้ฉันสามารถวนซ้ำในคอนเทนเนอร์โดยย้อนกลับด้วย for-loop for range ด้วยตัววนซ้ำอย่างชัดเจนฉันจะแปลงสิ่งนี้: for (auto i = c.begin(); i != c.end(); ++i) { ... เป็นนี้ for (auto i = c.rbegin(); i != c.rend(); ++i) { ... ฉันต้องการแปลงสิ่งนี้: for (auto& i: c) { ... สำหรับสิ่งนี้: for (auto& i: std::magic_reverse_adapter(c)) { ... มีอะไรแบบนี้หรือฉันต้องเขียนเองเหรอ?
321 c++  c++11  ranged-loops 

4
const vs constexpr กับตัวแปร
มีความแตกต่างระหว่างคำจำกัดความต่อไปนี้หรือไม่? const double PI = 3.141592653589793; constexpr double PI = 3.141592653589793; หากไม่ต้องการรูปแบบใดใน C ++ 11

7
รหัส C ++ สามารถใช้ได้ทั้งใน C ++ 03 และ C ++ 11 แต่ทำสิ่งที่แตกต่างกันหรือไม่
เป็นไปได้หรือไม่ที่รหัส C ++ จะสอดคล้องกับทั้งมาตรฐานC ++ 03และมาตรฐานC ++ 11แต่ทำสิ่งที่แตกต่างกันไปขึ้นอยู่กับมาตรฐานที่กำลังรวบรวม?

5
เริ่มเธรดด้วยฟังก์ชันสมาชิก
ฉันพยายามที่จะสร้างที่มีฟังก์ชั่นสมาชิกที่เกิดการขัดแย้งใดและผลตอบแทนstd::thread voidฉันไม่สามารถหาไวยากรณ์ที่ใช้งานได้ - คอมไพเลอร์บ่นไม่ว่าจะเกิดอะไรขึ้น เป็นวิธีที่ถูกต้องในการใช้งานspawn()เพื่อให้ผลตอบแทนstd::threadที่ดำเนินการtest()คืออะไร? #include <thread> class blub { void test() { } public: std::thread spawn() { return { test }; } };

8
ความแตกต่างใน make_shared และ shared_ptr ปกติใน C ++
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo")); Google และ StackOverflow โพสต์หลายคนจะมีเกี่ยวกับเรื่องนี้ แต่ผมไม่สามารถที่จะเข้าใจว่าทำไมจะมีประสิทธิภาพมากกว่าโดยตรงโดยใช้make_sharedshared_ptr ใครช่วยอธิบายฉันทีละขั้นตอนของวัตถุที่สร้างและการดำเนินการโดยทั้งสองเพื่อที่ฉันจะสามารถเข้าใจว่าmake_sharedมีประสิทธิภาพ ฉันได้ยกตัวอย่างหนึ่งตัวอย่างข้างต้นเพื่อการอ้างอิง
276 c++  c++11  shared-ptr 

1
“ int main () {(([] () {}) ());}” ใช้ได้อย่างไร ++
ฉันเพิ่งเจอชิ้นส่วนที่ลึกลับของรหัสต่อไปนี้ int main(){(([](){})());} จัดรูปแบบใหม่ดังต่อไปนี้เพื่อให้อ่านง่ายขึ้น: int main(){ (([](){})()); // Um... what?!?! } แต่ฉันไม่เข้าใจว่า(([](){})())รหัสถูกต้องอย่างไร มันดูเหมือนไวยากรณ์ตัวชี้ฟังก์ชันไม่ได้ มันไม่สามารถเป็นกลอุบายการบรรทุกเกินพิกัดบางอย่างได้ รหัสคอมไพล์ตามที่เป็นอยู่ Google ไม่ได้ช่วยอะไรมากนักในการค้นหาสัญลักษณ์ทั้งหมด แต่มันก็คอมไพล์ใน Visual Studio 2010 และไม่มีผลอะไร ไม่มีข้อผิดพลาดและไม่มีคำเตือน ดังนั้นดูเหมือนรหัสที่ถูกต้อง ผมไม่เคยเห็นรหัสที่ถูกต้องใด ๆ ที่อยู่นอกมหัศจรรย์ของJavascriptและC คำแนะนำการทำงาน บางคนสามารถอธิบายได้ว่าวิธีนี้ใช้ได้อย่างไร C ++
271 c++  c++11  lambda  syntax 

10
เราควรส่ง shared_ptr โดยอ้างอิงหรือตามค่าหรือไม่
เมื่อฟังก์ชั่นใช้shared_ptr(จากบูสต์หรือ C ++ 11 STL) คุณจะผ่านมัน: โดยอ้างอิง const: void foo(const shared_ptr<T>& p) หรือโดยค่า: void foo(shared_ptr<T> p)? ฉันชอบวิธีแรกเพราะฉันสงสัยว่ามันจะเร็วกว่า แต่สิ่งนี้คุ้มหรือไม่ คุณกรุณาให้เหตุผลในการเลือกของคุณหรือถ้าเป็นเช่นนั้นทำไมคุณคิดว่ามันไม่สำคัญ
270 c++  c++11  boost  shared-ptr 

16
เหตุใด C ++ จึงไม่มีตัวรวบรวมขยะ
ฉันไม่ได้ถามคำถามนี้เพราะข้อดีของการเก็บขยะก่อนอื่น เหตุผลหลักของฉันในการถามนี้คือฉันรู้ว่า Bjarne Stroustrup บอกว่า C ++ จะมีตัวรวบรวมขยะในบางเวลา พร้อมที่กล่าวว่าทำไมมันไม่ได้ถูกเพิ่มเข้ามา? มีนักสะสมขยะสำหรับ C ++ อยู่แล้ว นี่เป็นเพียงหนึ่งในประเภทที่ "พูดง่ายกว่าทำ" หรือมีเหตุผลอื่น ๆ ที่ยังไม่ถูกเพิ่ม (และจะไม่ถูกเพิ่มใน C ++ 11)? ลิงก์ข้าม: ตัวรวบรวมขยะสำหรับ C ++ เพื่อชี้แจงฉันเข้าใจเหตุผลที่ C ++ ไม่มีตัวรวบรวมขยะเมื่อสร้างครั้งแรก ฉันสงสัยว่าทำไมไม่สามารถเพิ่มนักสะสม


10
ทำไมแลมบ์ดาของ C ++ 11 ต้องการคำหลัก“ ไม่แน่นอน” สำหรับการจับภาพโดยค่าเริ่มต้น
ตัวอย่างสั้น ๆ : #include <iostream> int main() { int n; [&](){n = 10;}(); // OK [=]() mutable {n = 20;}(); // OK // [=](){n = 10;}(); // Error: a by-value capture cannot be modified in a non-mutable lambda std::cout << n << "\n"; // "10" } คำถาม: ทำไมเราต้องการmutableคำหลัก มันค่อนข้างแตกต่างจากการส่งพารามิเตอร์แบบดั้งเดิมไปยังฟังก์ชั่นที่ตั้งชื่อ เหตุผลเบื้องหลังคืออะไร …
256 c++  lambda  c++11 

8
“ เปิดออก” tuple เพื่อเรียกตัวชี้ฟังก์ชั่นการจับคู่
ฉันพยายามที่จะเก็บในstd::tupleจำนวนที่แตกต่างกันของค่าซึ่งในภายหลังจะใช้เป็นข้อโต้แย้งสำหรับการโทรไปยังตัวชี้ฟังก์ชั่นที่ตรงกับประเภทที่เก็บไว้ ฉันได้สร้างตัวอย่างแบบง่าย ๆ ที่แสดงปัญหาที่ฉันพยายามแก้ไข: #include <iostream> #include <tuple> void f(int a, double b, void* c) { std::cout << a << ":" << b << ":" << c << std::endl; } template <typename ...Args> struct save_it_for_later { std::tuple<Args...> params; void (*func)(Args...); void delayed_dispatch() { // How can I "unpack" params to …

8
วิธีทำให้ประเภทที่กำหนดเองของฉันทำงานกับ“ ช่วงตามลูป” ได้อย่างไร
เช่นเดียวกับหลาย ๆ คนในทุกวันนี้ฉันได้ลองใช้คุณสมบัติที่แตกต่างที่ C ++ 11 นำมาใช้ หนึ่งในรายการโปรดของฉันคือ "ช่วงตามลูป" ฉันเข้าใจ: for(Type& v : a) { ... } เทียบเท่ากับ: for(auto iv = begin(a); iv != end(a); ++iv) { Type& v = *iv; ... } และนั่นbegin()ก็แค่ส่งคืนa.begin()สำหรับคอนเทนเนอร์มาตรฐาน แต่สิ่งที่ถ้าผมต้องการที่จะทำให้ประเภทของฉันเอง "ช่วงที่ใช้สำหรับวง" -aware ? ฉันควรจะมีความเชี่ยวชาญbegin()และend()? หากประเภทที่กำหนดเองของฉันเป็นของเนมสเปซxmlฉันควรกำหนดxml::begin()หรือstd::begin()? ในระยะสั้นสิ่งที่เป็นแนวทางในการทำเช่นนั้น?

8
จำเป็นต้องใช้ std :: unique_ptr <T> เพื่อทราบความหมายแบบเต็มของ T หรือไม่?
ฉันมีรหัสในส่วนหัวที่มีลักษณะเช่นนี้: #include &lt;memory&gt; class Thing; class MyClass { std::unique_ptr&lt; Thing &gt; my_thing; }; ถ้าฉันรวมส่วนหัวนี้ใน cpp ที่ไม่ได้มีการThingกำหนดประเภทแล้วนี่ไม่ได้รวบรวมภายใต้ VS2010-SP1: 1&gt; ไฟล์ C: \ Program (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ memory (2067): ข้อผิดพลาด C2027: การใช้ประเภท 'สิ่งที่ไม่ได้กำหนด' แทนที่std::unique_ptrด้วยstd::shared_ptrและมันจะรวบรวม ดังนั้นฉันเดาว่านี่เป็นการนำไปใช้ของ VS2010 ในปัจจุบันstd::unique_ptrซึ่งต้องการคำจำกัดความเต็มรูปแบบและขึ้นอยู่กับการนำไปใช้โดยสิ้นเชิง หรือมันคืออะไร? มีบางสิ่งในข้อกำหนดมาตรฐานที่ทำให้เป็นไปไม่ได้std::unique_ptrที่การนำไปใช้เพื่อทำงานกับการประกาศล่วงหน้าเท่านั้น มันรู้สึกแปลกที่ควรถือพอยน์เตอร์ไว้เท่านั้นThingไม่ใช่เหรอ?

12
to_string ไม่ได้เป็นสมาชิกของ std กล่าวว่า g ++ (mingw)
ฉันกำลังทำโปรแกรมจดจำคำศัพท์ขนาดเล็กซึ่งคำต่างๆจะถูกกระพริบที่ฉันแบบสุ่มสำหรับความหมาย ฉันต้องการใช้ไลบรารี C ++ มาตรฐานเนื่องจาก Bjarne Stroustroup บอกเรา แต่ฉันพบปัญหาแปลก ๆ ที่ดูเหมือนจะเกิดขึ้นนอกประตู ฉันต้องการเปลี่ยนlongจำนวนเต็มstd::stringเพื่อให้สามารถเก็บไว้ในไฟล์ได้ ฉันมีงานทำto_string()เหมือนกัน ปัญหาคือเมื่อฉันรวบรวมมันด้วย g ++ (รุ่น 4.7.0 ตามที่ระบุไว้ใน --‍version flag) มันพูดว่า: PS C:\Users\Anurag\SkyDrive\College\Programs&gt; g++ -std=c++0x ttd.cpp ttd.cpp: In function 'int main()': ttd.cpp:11:2: error: 'to_string' is not a member of 'std' โปรแกรมของฉันที่ให้ข้อผิดพลาดนี้คือ: #include &lt;string&gt; int main() { std::to_string(0); return 0; …
245 c++  c++11  g++  mingw  tostring 

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