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

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


17
วิธีเปิดใช้งานการสนับสนุน C ++ 11 / C ++ 0x ใน Eclipse CDT
Eclipse 3.7.1 CDT 1.4.1 GCC 4.6.2 นี่คือตัวอย่างของรหัส C ++ 11: auto text = std::unique_ptr<char[]>(new char[len]); เอดิเตอร์ Eclipse บ่นเกี่ยวกับ: Function 'unique_ptr' could not be resolved การรวบรวม Makefile ทำงานได้ดี จะทำให้ Eclipse หยุดบ่นเกี่ยวกับข้อผิดพลาดประเภทนี้ได้อย่างไร

8
การส่งแลมบ์ดาเป็นตัวชี้ฟังก์ชัน
เป็นไปได้ไหมที่จะส่งผ่านฟังก์ชัน lambda เป็นตัวชี้ฟังก์ชัน ถ้าเป็นเช่นนั้นฉันจะต้องทำสิ่งที่ไม่ถูกต้องเพราะฉันได้รับข้อผิดพลาดในการรวบรวม ลองพิจารณาตัวอย่างต่อไปนี้ using DecisionFn = bool(*)(); class Decide { public: Decide(DecisionFn dec) : _dec{dec} {} private: DecisionFn _dec; }; int main() { int x = 5; Decide greaterThanThree{ [x](){ return x > 3; } }; return 0; } เมื่อฉันพยายามรวบรวมสิ่งนี้ฉันได้รับข้อผิดพลาดในการรวบรวมดังต่อไปนี้: In function 'int main()': 17:31: error: the value …

2
C ++ ที่ทันสมัยช่วยเพิ่มประสิทธิภาพให้คุณได้ฟรีหรือไม่?
บางครั้งมีการอ้างว่า C ++ 11/14 สามารถเพิ่มประสิทธิภาพให้คุณได้แม้เพียงแค่รวบรวมรหัส C ++ 98 การให้เหตุผลมักตามแนวความหมายของการย้ายเนื่องจากในบางกรณีตัวสร้าง rvalue จะถูกสร้างขึ้นโดยอัตโนมัติหรือตอนนี้เป็นส่วนหนึ่งของ STL ตอนนี้ฉันสงสัยว่าก่อนหน้านี้กรณีเหล่านี้ได้รับการจัดการโดย RVO หรือการเพิ่มประสิทธิภาพคอมไพเลอร์ที่คล้ายกันแล้ว คำถามของฉันคือถ้าคุณสามารถให้ตัวอย่างจริงของรหัส C ++ 98 ที่ไม่มีการดัดแปลงให้ทำงานได้เร็วขึ้นโดยใช้คอมไพเลอร์ที่สนับสนุนคุณสมบัติภาษาใหม่ ฉันเข้าใจว่าคอมไพเลอร์ที่ได้มาตรฐานไม่จำเป็นต้องทำการคัดลอกและโดยเหตุผลความหมายของการย้ายอาจทำให้เกิดความเร็ว แต่ฉันต้องการเห็นกรณีทางพยาธิวิทยาน้อยลงถ้าคุณต้องการ แก้ไข: เพื่อให้ชัดเจนฉันไม่ได้ถามว่าคอมไพเลอร์ใหม่นั้นเร็วกว่าคอมไพเลอร์เก่าหรือไม่ แต่ถ้ามีโค้ดที่เพิ่ม -std = c ++ 14 ให้คอมไพเลอร์ของฉันมันจะทำงานเร็วขึ้น (หลีกเลี่ยงการทำสำเนา แต่ถ้าคุณ สามารถเกิดขึ้นกับสิ่งอื่นนอกเหนือจากความหมายย้ายฉันก็มีความสนใจเช่นกัน)

7
เหตุใดจึงต้องใช้ฟังก์ชันเริ่มต้นและสิ้นสุดที่ไม่ใช่สมาชิกใน C ++ 11
คอนเทนเนอร์มาตรฐานทุกตัวมี a beginและendเมธอดสำหรับส่งคืนตัววนซ้ำสำหรับคอนเทนเนอร์นั้น อย่างไรก็ตาม C ++ 11 ได้เปิดตัวฟังก์ชั่นฟรีที่เรียกว่าstd::beginและฟังก์ชั่นการstd::endโทรbeginและendสมาชิก ดังนั้นแทนที่จะเขียน auto i = v.begin(); auto e = v.end(); คุณต้องการเขียน auto i = std::begin(v); auto e = std::end(v); ในคำพูดของเขาการเขียน Modern C ++ Herb Sutter บอกว่าคุณควรใช้ฟังก์ชั่นฟรีทันทีเมื่อคุณต้องการเริ่มต้นหรือสิ้นสุดตัววนซ้ำสำหรับคอนเทนเนอร์ อย่างไรก็ตามเขาไม่ได้ลงรายละเอียดว่าทำไมคุณถึงต้องการ การดูรหัสจะช่วยให้คุณประหยัดอักขระทั้งหมดหนึ่งตัว ดังนั้นเท่าที่ภาชนะมาตรฐานไปฟังก์ชั่นฟรีดูเหมือนจะไร้ประโยชน์อย่างสมบูรณ์ Herb Sutter ระบุว่ามีประโยชน์สำหรับภาชนะที่ไม่ได้มาตรฐาน แต่อีกครั้งเขาไม่ได้ลงรายละเอียด ดังนั้นคำถามคือสิ่งที่รุ่นฟังก์ชั่นอิสระของstd::beginและstd::endทำนอกเหนือจากการเรียกรุ่นฟังก์ชั่นสมาชิกที่สอดคล้องกันและทำไมคุณต้องการที่จะใช้พวกเขา?

3
การอ้างอิงที่ไม่ได้กำหนดถึง 'std :: cout'
นี่เป็นตัวอย่าง: #include <iostream> using namespace std; int main() { cout << "Hola, moondo.\n"; } มันพ่นข้อผิดพลาด: gcc -c main.cpp gcc -o edit main.o main.o: In function `main': main.cpp:(.text+0xa): undefined reference to `std::cout' main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)' main.o: In function `__static_initialization_and_destruction_0(int,int)': main.cpp:(.text+0x3d): undefined reference …
197 c++  c++11  gcc  cout 

2
ตัวแปร constexpr แบบคงที่ภายในฟังก์ชั่นเหมาะสมหรือไม่?
ถ้าฉันมีตัวแปรภายในฟังก์ชั่น (พูดเป็นอาร์เรย์ขนาดใหญ่) มันทำให้รู้สึกถึงการประกาศมันทั้งสองstaticและconstexpr? constexprรับประกันได้ว่าอาร์เรย์จะถูกสร้างขึ้นในเวลารวบรวมดังนั้นจะstaticไร้ประโยชน์หรือไม่? void f() { static constexpr int x [] = { // a few thousand elements }; // do something with the array } เป็นstaticสิ่งที่ทำจริงมีในแง่ของการสร้างรหัสหรือความหมาย?
193 c++  static  c++11  constexpr 

9
สำนวน C ++ ใดเลิกใช้ใน C ++ 11
ด้วยมาตรฐานใหม่มีวิธีการใหม่ในการทำสิ่งต่าง ๆ และหลายวิธีก็ดีกว่าแบบเก่า แต่วิธีเก่ายังคงใช้ได้ เป็นที่ชัดเจนว่ามาตรฐานใหม่ไม่ได้คัดค้านอย่างเป็นทางการมากนักเนื่องจากเหตุผลด้านความเข้ากันได้แบบย้อนหลัง ดังนั้นคำถามที่เหลืออยู่คือ: วิธีการเข้ารหัสแบบเก่า ๆ นั้นด้อยกว่า C ++ 11 สไตล์แน่นอนและตอนนี้เราจะทำอะไรได้บ้าง? ในการตอบคำถามนี้คุณอาจข้ามสิ่งที่ชัดเจนเช่น "ใช้ตัวแปรอัตโนมัติ"
192 c++  c++11  c++-faq 

2
ฟีเจอร์ Boost ใดที่ทับซ้อนกับ C ++ 11
ฉันใส่ทักษะ C ++ ของฉันบนชั้นวางเมื่อหลายปีก่อนและดูเหมือนตอนนี้เมื่อฉันต้องการมันอีกครั้งภูมิทัศน์ก็เปลี่ยนไป ตอนนี้เรามี C ++ 11 และความเข้าใจของฉันคือมันทับซ้อนกับฟีเจอร์ Boost มากมาย มีข้อสรุปบางอย่างที่ทับซ้อนกันอยู่ซึ่ง Boost ห้องสมุดใดที่จะกลายเป็นมรดกแนะนำว่าคุณสมบัติ C ++ 11 ที่จะใช้แทนการเพิ่มและที่ไม่ดีกว่า?
192 c++  boost  c++11 

7
ทำไม std :: list :: reverse มีความซับซ้อน O (n)
เหตุใดฟังก์ชันย้อนกลับสำหรับstd::listคลาสในไลบรารีมาตรฐาน C ++ จึงมี Linear runtime ฉันคิดว่าสำหรับรายการที่ลิงก์สองเท่าฟังก์ชันย้อนกลับควรเป็น O (1) การย้อนกลับรายการที่เชื่อมโยงเป็นทวีคูณควรเกี่ยวข้องกับการสลับหัวและตัวชี้ท้าย
192 c++  c++11  stl  linked-list 

5
อะไรคือประเด็นของ noreturn?
[dcl.attr.noreturn]ให้ตัวอย่างต่อไปนี้: [[ noreturn ]] void f() { throw "error"; // OK } แต่ผมไม่เข้าใจสิ่งที่เป็นจุดของเพราะประเภทการกลับมาของฟังก์ชั่นที่มีอยู่แล้ว[[noreturn]]void ดังนั้นประเด็นของnoreturnคุณสมบัติคืออะไร? ควรใช้อย่างไร?


16
ฉันจะโทร :: std :: make_shared ในคลาสที่มีเพียง constructor ที่ได้รับการป้องกันหรือส่วนตัวได้อย่างไร
ฉันมีรหัสนี้ใช้งานไม่ได้ แต่ฉันคิดว่าเจตนาชัดเจน: testmakeshared.cpp #include <memory> class A { public: static ::std::shared_ptr<A> create() { return ::std::make_shared<A>(); } protected: A() {} A(const A &) = delete; const A &operator =(const A &) = delete; }; ::std::shared_ptr<A> foo() { return A::create(); } แต่ฉันได้รับข้อผิดพลาดนี้เมื่อรวบรวม: g++ -std=c++0x -march=native -mtune=native -O3 -Wall testmakeshared.cpp In file included …
187 c++  c++11  shared-ptr 

6
การอ้างอิงที่ไม่ได้กำหนดถึง constexpr แบบคงที่ []
ฉันต้องการstatic const charอาร์เรย์ในชั้นเรียนของฉัน GCC บ่นและบอกว่าฉันควรใช้constexprถึงแม้ว่าตอนนี้มันจะบอกฉันว่ามันเป็นข้อมูลอ้างอิงที่ไม่ได้กำหนด ถ้าฉันทำให้อาร์เรย์ไม่ใช่สมาชิกแล้วมันจะรวบรวม เกิดอะไรขึ้น? // .hpp struct foo { void bar(); static constexpr char baz[] = "quz"; }; // .cpp void foo::bar() { std::string str(baz); // undefined reference to baz }

4
std :: auto_ptr ถึง std :: unique_ptr
กับมาตรฐานใหม่ที่มา (และชิ้นส่วนอยู่แล้วในบางคอมไพเลอร์) รูปแบบใหม่ควรจะเป็นแทน std::unique_ptrstd::auto_ptr การใช้งานของพวกเขาทับซ้อนกันหรือไม่ (เพื่อให้ฉันสามารถค้นหา / แทนที่ทั่วโลกบนโค้ดของฉัน (ไม่ใช่ว่าฉันจะทำสิ่งนี้ แต่ถ้าฉันทำ)) หรือฉันควรตระหนักถึงความแตกต่างที่ไม่ชัดเจนจากการอ่านเอกสาร? นอกจากนี้ถ้ามันเป็นแทนโดยตรงทำไมให้มันชื่อใหม่มากกว่าแค่การปรับปรุงstd::auto_ptr?

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