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

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

7
ฉันจะส่งออกค่าของคลาส enum ใน C ++ 11 ได้อย่างไร
ฉันจะส่งออกค่าของenum classใน C ++ 11 ได้อย่างไร ใน C ++ 03 จะเป็นเช่นนี้: #include <iostream> using namespace std; enum A { a = 1, b = 69, c= 666 }; int main () { A a = A::c; cout << a << endl; } ใน c ++ 0x รหัสนี้ไม่ได้รวบรวม #include <iostream> using …

3
ความแตกต่างระหว่าง C ++ 03 throw () specifier C ++ 11 noexcept
มีความแตกต่างระหว่าง throw()และnoexceptอื่น ๆ นอกเหนือจากการตรวจสอบที่รันไทม์และรวบรวมเวลาตามลำดับ? บทความ Wikipedia C ++ 11 นี้ชี้ให้เห็นว่าตัวระบุการโยน C ++ 03 เลิกใช้งานแล้ว เหตุใดจึงมีnoexceptความสามารถเพียงพอที่จะครอบคลุมทุกสิ่งในเวลาคอมไพล์ [หมายเหตุ: ฉันตรวจสอบคำถามนี้และบทความนี้แล้ว แต่ไม่สามารถระบุเหตุผลที่ชัดเจนในการเลิกใช้งานได้]
100 c++  exception  c++11  throw  noexcept 

3
การใช้งาน gcc std :: unordered_map ช้าหรือไม่ ถ้าเป็นเช่นนั้น - ทำไม?
เรากำลังพัฒนาซอฟต์แวร์สำคัญที่มีประสิทธิภาพสูงใน C ++ ที่นั่นเราต้องมีแผนที่แฮชพร้อมกันและนำไปใช้ std::unordered_mapดังนั้นเราจึงเขียนมาตรฐานที่จะคิดออกเท่าไหร่ช้ากว่าแผนที่กัญชาพร้อมกันของเราจะถูกเมื่อเทียบกับ แต่std::unordered_mapดูเหมือนว่าจะไม่น่าเชื่อช้า ... ดังนั้นนี้เป็นของเราไมโครมาตรฐาน (สำหรับแผนที่พร้อมกันเรากลับกลายเป็นหัวข้อใหม่เพื่อให้แน่ใจว่าการล็อคไม่ได้รับการปรับให้เหมาะสมออกไปและทราบว่าฉันไม่เคย Inser 0 เพราะผมยังมาตรฐานด้วยgoogle::dense_hash_map, ซึ่งต้องการค่า null): boost::random::mt19937 rng; boost::random::uniform_int_distribution<> dist(std::numeric_limits<uint64_t>::min(), std::numeric_limits<uint64_t>::max()); std::vector<uint64_t> vec(SIZE); for (int i = 0; i < SIZE; ++i) { uint64_t val = 0; while (val == 0) { val = dist(rng); } vec[i] = val; } std::unordered_map<int, long …

2
ความแตกต่างระหว่าง std :: result_of และ Decltype
ฉันมีปัญหาในการทำความเข้าใจความจำเป็นstd::result_ofใน C ++ 0x ถ้าฉันเข้าใจถูกต้องresult_ofใช้เพื่อรับชนิดผลลัพธ์ของการเรียกใช้อ็อบเจ็กต์ฟังก์ชันด้วยพารามิเตอร์บางประเภท ตัวอย่างเช่น: template <typename F, typename Arg> typename std::result_of<F(Arg)>::type invoke(F f, Arg a) { return f(a); } ฉันไม่เห็นความแตกต่างกับรหัสต่อไปนี้: template <typename F, typename Arg> auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter { return f(a); } หรือ template <typename F, typename Arg> auto invoke(F …
100 c++  c++11  decltype  result-of 

6
การเริ่มต้นอาร์เรย์สมาชิกในตัวสร้างเริ่มต้น
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; ฉันเชื่อว่าเหตุผลคืออาร์เรย์สามารถเริ่มต้นด้วย=ไวยากรณ์เท่านั้นนั่นคือ: int arr[3] = {1,3,4}; คำถาม ฉันจะทำสิ่งที่ต้องการได้อย่างไร (นั่นคือเริ่มต้นอาร์เรย์ในตัวสร้าง (ไม่ได้กำหนดองค์ประกอบในเนื้อความ)) เป็นไปได้หรือไม่? มาตรฐาน C ++ 03 พูดอะไรเป็นพิเศษเกี่ยวกับการเริ่มต้นการรวม (รวมถึงอาร์เรย์) ใน ctor initializers หรือไม่ หรือความไม่ถูกต้องของรหัสข้างต้นเป็นข้อพิสูจน์ของกฎอื่น ๆ ? รายการเริ่มต้น C ++ 0x …

12
การลบรายการออกจากเวกเตอร์ในขณะที่อยู่ใน C ++ 11 ช่วง 'for' loop?
ฉันมีเวกเตอร์ของ IInventory * และฉันกำลังวนรอบรายการโดยใช้ช่วง C ++ 11 เพื่อทำสิ่งต่างๆกับแต่ละอัน หลังจากดำเนินการบางอย่างแล้วฉันอาจต้องการลบออกจากรายการและลบวัตถุนั้น ฉันรู้ว่าฉันสามารถเรียกdeleteตัวชี้ได้ทุกเมื่อเพื่อทำความสะอาด แต่วิธีใดที่เหมาะสมในการลบออกจากเวกเตอร์ในขณะที่อยู่ในforลูปช่วง และถ้าฉันลบมันออกจากรายการลูปของฉันจะเป็นโมฆะหรือไม่? std::vector<IInventory*> inv; inv.push_back(new Foo()); inv.push_back(new Bar()); for (IInventory* index : inv) { // Do some stuff // OK, I decided I need to remove this object from 'inv'... }
100 c++  vector  for-loop  c++11 

2
อะไรคือกฎสำหรับโทเค็น“ …” ในบริบทของเทมเพลตแบบต่างๆ
ใน C ++ 11 มีเทมเพลตที่หลากหลายเช่นนี้: template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); } มีวิทยากรบางคนเกี่ยวกับเรื่องนี้: การแสดงออกstd::forward<Args>(args)...ใช้ทั้งArgsและargsแต่เพียงหนึ่ง...โทเค็น นอกจากนี้ยังstd::forwardเป็นฟังก์ชันเทมเพลตที่ไม่แปรผันโดยใช้พารามิเตอร์เทมเพลตเดียวและอาร์กิวเมนต์เดียว กฎไวยากรณ์สำหรับสิ่งนั้น (คร่าวๆ) คืออะไร? จะสรุปได้อย่างไร? นอกจากนี้: ในการใช้งานฟังก์ชันจุดไข่ปลา ( ...) อยู่ที่ส่วนท้ายของนิพจน์ที่สนใจ มีเหตุผลไหมที่ในรายการอาร์กิวเมนต์เทมเพลตและรายการพารามิเตอร์ที่จุดไข่ปลาอยู่ตรงกลาง

3
จะตรวจสอบได้อย่างไรว่า std :: function ว่างใน C ++ 11 หรือไม่?
ฉันสงสัยว่าจะตรวจสอบอย่างไรว่าstd::functionว่างเปล่า ลองพิจารณาตัวอย่างนี้: class Test { std::function<void(int a)> eventFunc; void registerEvent(std::function<void(int a)> e) { eventFunc = e; } void doSomething() { ... eventFunc(42); } }; รหัสนี้รวบรวมได้ดีใน MSVC แต่ถ้าฉันโทรdoSomething()โดยไม่เริ่มต้นeventFuncรหัสจะขัดข้องอย่างเห็นได้ชัด เป็นที่คาดหวัง แต่ฉันสงสัยว่าค่าของeventFunc? 'empty'ดีบักเกอร์กล่าวว่า ดังนั้นฉันจึงแก้ไขโดยใช้คำสั่ง if ง่ายๆ: void doSomething() { ... if (eventFunc) { eventFunc(42); } } ใช้งานได้ แต่ฉันยังสงสัยว่าค่าของการไม่เริ่มต้นstd::functionคืออะไร? ฉันอยากจะเขียนif (eventFunc != nullptr)แต่std::function(ชัด ๆ …

8
initializer_list และย้ายความหมาย
ฉันได้รับอนุญาตให้ย้ายองค์ประกอบออกจากไฟล์ std::initializer_list<T> ? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } เนื่องจากstd::intializer_list<T>ต้องการความสนใจของคอมไพเลอร์เป็นพิเศษและไม่มีค่าความหมายเหมือนคอนเทนเนอร์ปกติของไลบรารีมาตรฐาน C ++ ฉันควรจะปลอดภัยดีกว่าขอโทษและถาม

4
ทำไมเราลอกแล้วย้าย?
ฉันเห็นรหัสที่ไหนสักแห่งที่มีคนตัดสินใจคัดลอกออบเจ็กต์แล้วย้ายไปยังสมาชิกข้อมูลของคลาส สิ่งนี้ทำให้ฉันสับสนเพราะฉันคิดว่าจุดทั้งหมดของการเคลื่อนไหวคือการหลีกเลี่ยงการคัดลอก นี่คือตัวอย่าง: struct S { S(std::string str) : data(std::move(str)) {} }; นี่คือคำถามของฉัน: ทำไมเราไม่ใช้ rvalue-reference str? สำเนาจะไม่แพงโดยเฉพาะอย่างยิ่งเช่นstd::string? อะไรคือสาเหตุที่ทำให้ผู้เขียนตัดสินใจทำสำเนาแล้วย้าย? เมื่อไหร่ที่ควรทำด้วยตัวเอง?

5
ความแตกต่างระหว่าง std :: system_clock และ std :: steady_clock?
อะไรคือความแตกต่างระหว่างstd::system_clockและstd::steady_clock? (กรณีตัวอย่างที่แสดงผลลัพธ์ / พฤติกรรมที่แตกต่างกันจะดีมาก) ถ้าเป้าหมายของฉันคือการได้อย่างแม่นยำวัดเวลาการดำเนินการของฟังก์ชั่น (เช่นมาตรฐาน) สิ่งที่จะเป็นทางเลือกที่ดีที่สุดระหว่างstd::system_clock, std::steady_clockและstd::high_resolution_clock?
98 c++  c++11  timer  chrono 

4
การใช้ตัวดำเนินการเปรียบเทียบผ่าน 'tuple' และ 'tie' เป็นความคิดที่ดีหรือไม่?
(หมายเหตุ: tupleและtieสามารถนำมาจาก Boost หรือ C ++ 11) เมื่อเขียนโครงสร้างขนาดเล็กที่มีเพียงสององค์ประกอบบางครั้งฉันมักจะเลือก a std::pairเนื่องจากมีการทำสิ่งสำคัญทั้งหมดสำหรับประเภทข้อมูลนั้นแล้วเช่นoperator<การจัดลำดับที่เข้มงวด - อ่อนแอ . ข้อเสียคือชื่อตัวแปรที่ค่อนข้างไร้ประโยชน์ แม้ว่าฉันจะสร้างสิ่งนั้นขึ้นมาเองtypedefแต่ฉันก็จำไม่ได้ว่า 2 วันต่อมาว่าfirstอะไรsecondคืออะไรโดยเฉพาะอย่างยิ่งถ้าทั้งสองเป็นประเภทเดียวกัน สิ่งนี้จะแย่ลงไปอีกสำหรับสมาชิกมากกว่าสองคนเนื่องจากการทำรังนั้นpairค่อนข้างแย่มาก อีกทางเลือกหนึ่งคือไฟล์tupleไม่ว่าจะจาก Boost หรือ C ++ 11 แต่ก็ไม่ได้ดูดีและชัดเจนขึ้น ดังนั้นฉันจึงกลับไปเขียนโครงสร้างด้วยตัวเองรวมถึงตัวดำเนินการเปรียบเทียบที่จำเป็น เนื่องจากโดยเฉพาะอย่างยิ่งoperator<อาจเป็นเรื่องยุ่งยากฉันจึงคิดที่จะหลีกเลี่ยงความยุ่งเหยิงทั้งหมดนี้โดยอาศัยการดำเนินการที่กำหนดไว้สำหรับtuple: ตัวอย่างoperator<เช่นสำหรับการสั่งซื้อที่เข้มงวด - อ่อนแอ: bool operator<(MyStruct const& lhs, MyStruct const& rhs){ return std::tie(lhs.one_member, lhs.another, lhs.yet_more) < std::tie(rhs.one_member, rhs.another, rhs.yet_more); } ( tieทำให้tupleของT&การอ้างอิงจากการขัดแย้งผ่าน.) แก้ไข : …

1
การเริ่มต้นสมาชิกขณะใช้ตัวสร้างที่ได้รับมอบหมาย
ฉันได้เริ่มลองใช้มาตรฐาน C ++ 11 แล้วและฉันพบคำถามนี้ซึ่งอธิบายถึงวิธีการเรียก ctor ของคุณจาก ctor อื่นในคลาสเดียวกันเพื่อหลีกเลี่ยงการมีวิธีการเริ่มต้นหรือสิ่งที่คล้ายกัน ตอนนี้ฉันกำลังลองสิ่งเดียวกันกับรหัสที่มีลักษณะดังนี้: hpp: class Tokenizer { public: Tokenizer(); Tokenizer(std::stringstream *lines); virtual ~Tokenizer() {}; private: std::stringstream *lines; }; cpp: Tokenizer::Tokenizer() : expected('=') { } Tokenizer::Tokenizer(std::stringstream *lines) : Tokenizer(), lines(lines) { } แต่นี่ทำให้ฉันเกิดข้อผิดพลาด: In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegationฉันได้ลองย้ายส่วน …

6
วิธีที่ทันสมัยในการกรอง STL container?
กลับมาที่ C ++ หลังจากหลายปีของ C # ฉันสงสัยว่าสิ่งที่ทันสมัย ​​- อ่าน: C ++ 11 - วิธีการกรองอาร์เรย์จะเป็นอย่างไรเช่นเราจะบรรลุสิ่งที่คล้ายกับแบบสอบถาม Linq นี้ได้อย่างไร: var filteredElements = elements.Where(elm => elm.filterProperty == true); เพื่อกรองเวกเตอร์ขององค์ประกอบ ( stringsสำหรับคำถามนี้)? ฉันหวังเป็นอย่างยิ่งว่าอัลกอริทึมสไตล์ STL แบบเก่า (หรือแม้กระทั่งส่วนขยายเช่นboost::filter_iterator) ที่ต้องการกำหนดวิธีการที่ชัดเจนจะถูกแทนที่ด้วยในตอนนี้?
98 c++  c++11  stl 

5
ฉันสามารถแสดงรายการ - เริ่มต้นเวกเตอร์ประเภทย้ายอย่างเดียวได้หรือไม่
ถ้าฉันส่งรหัสต่อไปนี้ผ่านสแนปชอต GCC 4.7 ของฉันมันจะพยายามคัดลอกunique_ptrs ลงในเวกเตอร์ #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } เห็นได้ชัดว่าไม่สามารถทำงานได้เนื่องจากstd::unique_ptrไม่สามารถคัดลอกได้: ข้อผิดพลาด: การใช้ฟังก์ชันที่ถูกลบ 'std :: unique_ptr <_Tp, _Dp> :: unique_ptr (const std :: unique_ptr <_Tp, _Dp> &) [ด้วย _Tp = int; _Dp = std :: default_delete; …

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