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

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

3
C ++ decltype และวงเล็บ - ทำไม
มีการพูดถึง เรื่องนี้มาก่อนแต่นี่ไม่ได้ซ้ำกัน เมื่อมีคนถามถึงความแตกต่างระหว่างdecltype(a)และdecltype((a))คำตอบปกติคือ - aเป็นตัวแปร(a)คือการแสดงออก ฉันพบคำตอบนี้ไม่พอใจ อย่างแรกaคือการแสดงออกเช่นกัน ตัวเลือกสำหรับการแสดงออกหลักได้แก่ หมู่คนอื่น ๆ - (นิพจน์) ID-แสดงออก ที่สำคัญกว่านั้นการใช้ถ้อยคำสำหรับเดคไทป์จะพิจารณาวงเล็บอย่างชัดเจนมาก : For an expression e, the type denoted by decltype(e) is defined as follows: (1.1) if e is an unparenthesized id-expression naming a structured binding, ... (1.2) otherwise, if e is an unparenthesized id-expression naming a …

4
เหตุใดจึงมีการใช้สองประโยคในการแก้ไขประเภทเดียวกันที่เห็นว่ามีความน่าสงสัยใน gcc
ฉันมีคลาสพื้นฐานสองคลาสที่ใช้ส่วนคำสั่ง class MultiCmdQueueCallback { using NetworkPacket = Networking::NetworkPacket; .... } class PlcMsgFactoryImplCallback { using NetworkPacket = Networking::NetworkPacket; .... } ฉันประกาศชั้นเรียน class PlcNetwork : public RouterCallback, public PlcMsgFactoryImplCallback, public MultiCmdQueueCallback { private: void sendNetworkPacket(const NetworkPacket &pdu); } คอมไพเลอร์ตั้งค่าสถานะการอ้างอิงข้อผิดพลาด 'NetworkPacket' ไม่ชัดเจน 'sendNetworkPacket (NetworkPacket & ... ' ตอนนี้ทั้งสองใช้ 'การใช้คำสั่ง' เพื่อเครือข่ายระดับพื้นฐานเดียวกัน: NetworkPacket และในความเป็นจริงถ้าฉันแทนที่การประกาศวิธีการด้วย: void …

2
พฤติกรรมแปลก ๆ กับฟิลด์คลาสเมื่อเพิ่มไปยัง std :: vector
ฉันได้พบพฤติกรรมแปลก ๆ บางอย่าง (บนเสียงดังกราวและ GCC) ในสถานการณ์ต่อไปนี้ ฉันมีเวกเตอร์ที่มีองค์ประกอบหนึ่งซึ่งเป็นตัวอย่างของการเรียนnodes Nodeจากนั้นฉันเรียกฟังก์ชันnodes[0]ที่เพิ่มNodeเวกเตอร์ใหม่ เมื่อเพิ่มโหนดใหม่ฟิลด์ของวัตถุที่เรียกจะถูกรีเซ็ต! อย่างไรก็ตามพวกเขาดูเหมือนจะกลับสู่ปกติอีกครั้งเมื่อฟังก์ชั่นเสร็จสิ้น ฉันเชื่อว่านี่เป็นตัวอย่างที่ทำซ้ำได้น้อยที่สุด: #include <iostream> #include <vector> using namespace std; struct Node; vector<Node> nodes; struct Node{ int X; void set(){ X = 3; cout << "Before, X = " << X << endl; nodes.push_back(Node()); cout << "After, X = " << X …

6
เป็นไปได้หรือไม่ที่ #include หายไปเพื่อหยุดโปรแกรมเมื่อรันไทม์?
มีกรณีใดบ้างที่ขาดหายไป#includeจะทำให้ซอฟต์แวร์เสียหายขณะรันไทม์ในขณะที่บิลด์ยังดำเนินต่อไป ในคำอื่น ๆ มันเป็นไปได้ที่ #include "some/code.h" complexLogic(); cleverAlgorithms(); และ complexLogic(); cleverAlgorithms(); ทั้งสองจะสร้างได้สำเร็จ แต่ประพฤติแตกต่างกันอย่างไร
31 c++ 

4
(…) เรียกใน C และ C ++ คืออะไร
หนึ่งของการใช้งานของ...คือการแสดงvariadicหน่วยงานใน C และ C ++ มันชื่ออะไร? มันจัดอยู่ในประเภทโอเปอเรเตอร์หรืออย่างอื่นเมื่อใช้งานในลักษณะนั้นหรือไม่? รายละเอียดอื่น ๆ เกี่ยวกับ...? แก้ไข:...ฉันรู้ว่าวัตถุประสงค์ของการ ฉันถามชื่อและการจำแนกซึ่งฉันหวังว่าจะคล้ายกันในทั้ง C และ C ++

6
การสลับเวกเตอร์สองตัวที่แตกต่างกันใน C ++ ใช้วิธี std :: vector :: swap ปลอดภัยหรือไม่?
สมมติว่าคุณมีรหัสต่อไปนี้: #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> First{"example", "second" , "C++" , "Hello world" }; std::vector<std::string> Second{"Hello"}; First.swap(Second); for(auto a : Second) std::cout << a << "\n"; return 0; } ลองนึกภาพเวกเตอร์ไม่ใช่std::stringยังคลาส: std::vector<Widget> WidgetVector; std::vector<Widget2> Widget2Vector; มันปลอดภัยไหมที่จะสลับสองเวกเตอร์ด้วยstd::vector::swapวิธีการ: WidgetVector.swap(Widget2Vector);หรือมันจะนำไปสู่ ​​UB?
30 c++  c++11  vector  stdvector  swap 

4
คัดลอก structs กับสมาชิกที่ไม่ได้กำหนดค่าเริ่มต้น
มันถูกต้องหรือไม่ที่จะคัดลอก struct ที่สมาชิกบางคนไม่ได้เริ่มต้น? ฉันสงสัยว่ามันเป็นพฤติกรรมที่ไม่ได้กำหนด แต่ถ้าเป็นเช่นนั้นมันจะทำให้สมาชิกที่ไม่ได้กำหนดค่าเริ่มต้นในโครงสร้าง (แม้ว่าสมาชิกเหล่านั้นจะไม่เคยใช้งานโดยตรง) ค่อนข้างอันตราย ดังนั้นฉันสงสัยว่ามีบางอย่างในมาตรฐานที่อนุญาตหรือไม่ เช่นนี้ถูกต้องหรือไม่ struct Data { int a, b; }; int main() { Data data; data.a = 5; Data data2 = data; }

2
ทำไม `std :: string :: find ()` ไม่ส่งคืนตัววนซ้ำสุดท้ายเมื่อความล้มเหลว?
ฉันพบว่าพฤติกรรมของstd::string::findไม่สอดคล้องกับคอนเทนเนอร์ C ++ มาตรฐาน เช่น std::map<int, int> myMap = {{1, 2}}; auto it = myMap.find(10); // it == myMap.end() แต่สำหรับสตริง std::string myStr = "hello"; auto it = myStr.find('!'); // it == std::string::npos ทำไมไม่ควรล้มเหลวในmyStr.find('!')การกลับมาmyStr.end()แทนstd::string::npos? เนื่องจากstd::stringค่อนข้างจะพิเศษเมื่อเทียบกับตู้คอนเทนเนอร์อื่น ๆ ฉันสงสัยว่ามีเหตุผลจริง ๆ อยู่เบื้องหลังสิ่งนี้หรือไม่ (น่าแปลกที่ฉันไม่พบใครซักคนที่นี่)

2
ทำไม std :: hash ไม่รับประกันว่าจะถูกกำหนดขึ้น?
หลังจากนี้เราใช้N4140 (มาตรฐาน C ++ 14) ตาม§ 17.6.3.4 ต้องการแฮ , ค่าที่ส่งคืนจะขึ้นอยู่กับอาร์กิวเมนต์k ในช่วงเวลาของโปรแกรมเท่านั้น [หมายเหตุ: ดังนั้นการประเมินผลทั้งหมดของการแสดงออกh(k)ที่มีค่าเหมือนกันสำหรับ kผลผลิตผลเดียวกันสำหรับการดำเนินการที่กำหนดของโปรแกรม - บันทึกท้าย] และแฮชของเทมเพลตคลาส Class 20.9.12พูดว่า ... การเริ่มต้นhash<Key>จะต้อง: (1.1) - ตอบสนองความต้องการของแฮช (17.6.3.4) ... (1.2) - ... ซึ่งหมายความว่าค่าแฮชของvalue(เช่นhash<decltype(value)>(value)) อาจใช้ค่าอื่นหากคุณรีสตาร์ทโปรแกรม แต่ทำไม ข้อ จำกัด นี้ไม่ได้อยู่ในมาตรฐานของ C ++ 11 แต่อยู่ในมาตรฐานของ C ++ 14, C ++ 17 และ C ++ 20 ในฐานะผู้ใช้ …

1
ตัวนับเวลารวบรวม C ++ ได้รับการตรวจสอบอีกครั้ง
TL; DR ก่อนที่คุณจะพยายามอ่านโพสต์นี้ให้รู้ว่า: พบวิธีแก้ไขปัญหาที่นำเสนอด้วยตัวเองแต่ฉันก็ยังอยากรู้ว่าการวิเคราะห์นั้นถูกต้องหรือไม่ ฉันได้จัดทำแพคเกจลงในfameta::counterชั้นเรียนที่สามารถแก้ไขนิสัยใจคอที่เหลืออยู่สองสามข้อ คุณสามารถค้นหาได้ใน GitHub ; คุณสามารถเห็นมันในการทำงานใน godbolt มันเริ่มต้นอย่างไร ตั้งแต่ Filip Roséenค้นพบ / คิดค้นในปี 2015 เวทมนตร์ดำที่รวบรวมเวลาอยู่ใน C ++ฉันได้รับการหมกมุ่นกับอุปกรณ์อย่างอ่อนโยนดังนั้นเมื่อ CWG ตัดสินใจว่าการทำงานต้องไปฉันผิดหวัง แต่ก็ยังหวังว่าใจของพวกเขา อาจมีการเปลี่ยนแปลงโดยแสดงกรณีการใช้งานที่น่าสนใจ จากนั้นสองสามปีที่ผ่านมาฉันตัดสินใจที่จะดูสิ่งนั้นอีกครั้งเพื่อให้uberswitch esสามารถซ้อนกันได้ - กรณีใช้ที่น่าสนใจในความคิดของฉัน - เพียงเพื่อค้นพบว่ามันจะไม่ทำงานอีกต่อไปกับเวอร์ชันใหม่ของ คอมไพเลอร์ที่มีอยู่แม้ว่าปัญหา 2118คือ (และยังคงเป็น ) ในสถานะเปิด: โค้ดจะคอมไพล์ แต่ตัวนับจะไม่เพิ่มขึ้น มีการรายงานปัญหาบนเว็บไซต์ของRoséenและเมื่อเร็ว ๆ นี้บน stackoverflow: C ++ รองรับเคาน์เตอร์เวลาคอมไพล์หรือไม่? ไม่กี่วันที่ผ่านมาฉันตัดสินใจลองแก้ไขปัญหาอีกครั้ง ฉันต้องการที่จะเข้าใจสิ่งที่มีการเปลี่ยนแปลงในคอมไพเลอร์ที่ทำให้ C ++ ที่ดูเหมือนจะยังคงใช้งานได้ไม่ทำงานอีกต่อไป ด้วยเหตุนี้ฉันจึงค้นหาผู้คนให้พูดคุยเกี่ยวกับเรื่องนี้อย่างกว้างขวางและห่างไกล …

1
ชั้นไม่สามารถเข้าถึงวิธี constexpr คงที่ส่วนตัวของตัวเอง - ข้อผิดพลาดดังกราว?
รหัสนี้ไม่ได้รวบรวมใน Clang (6,7,8,9 ลำตัว) แต่รวบรวมได้ใน GCC (7.1, 8.1, 9.1): template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder<bool>{}; } else { return TypeHolder<T>{}; } } public: template<class T> …

2
ทำไมคลาสของฉันจึงไม่ใช่ค่าเริ่มต้นที่สามารถสร้างได้?
ฉันมีชั้นเรียนเหล่านั้น: #include <type_traits> template <typename T> class A { public: static_assert(std::is_default_constructible_v<T>); }; struct B { struct C { int i = 0; }; A<C> a_m; }; int main() { A<B::C> a; } เมื่อทำการคอมไพล์a_mไม่ใช่ค่าเริ่มต้นที่สามารถสร้างได้ แต่aเป็น เมื่อเปลี่ยนCเป็น: struct C { int i; }; ทุกอย่างปกติดี. ทดสอบกับเสียงดังกราว 9.0.0
28 c++ 

1
เหตุใดใน C ++ static_cast <unsigned> ของจำนวนลบจึงแตกต่างกันถ้าจำนวนนั้นเป็นค่าคงที่หรือไม่
กฎ C ++ ที่มีความหมายเท่าเทียมกันคือเท็จ ? ได้รับ: float f {-1.0}; bool equal = (static_cast&lt;unsigned&gt;(f) == static_cast&lt;unsigned&gt;(-1.0)); เช่นhttps://godbolt.org/z/fcmx2P #include &lt;iostream&gt; int main() { float f {-1.0}; const float cf {-1.0}; std::cout &lt;&lt; std::hex; std::cout &lt;&lt; " f" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(f) &lt;&lt; '\n'; std::cout &lt;&lt; "cf" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(cf) &lt;&lt; '\n'; …
28 c++  casting 

3
เหตุใดจึงเลือกตัวดำเนินการแปลงเกินพิกัดนี้
พิจารณารหัสต่อไปนี้ struct any { template &lt;typename T&gt; operator T &amp;&amp;() const; template &lt;typename T&gt; operator T &amp;() const; }; int main() { int a = any{}; } ที่นี่ผู้ประกอบการแปลงที่สองถูกเลือกโดยความละเอียดเกินพิกัด ทำไม? เท่าที่ฉันเข้าใจผู้ประกอบการทั้งสองจะอนุมานoperator int &amp;&amp;() constและoperator int &amp;() constตามลำดับ ทั้งสองอยู่ในชุดของฟังก์ชันที่ทำงานได้ การอ่านผ่าน [over.match.best] ไม่ได้ช่วยฉันหาสาเหตุว่าทำไมสิ่งหลังถึงดีกว่า เหตุใดฟังก์ชันหลังจึงดีกว่ารุ่นก่อน

2
เมื่อแลมบ์ดาจับตัวนี้แล้วจะต้องใช้อย่างชัดเจนหรือไม่?
ตัวอย่างที่ฉันพบว่าการจับภาพthisในแลมบ์ดาใช้อย่างชัดเจน เช่น: capturecomplete = [this](){this-&gt;calstage1done();}; แต่ดูเหมือนว่ามันเป็นไปได้ที่จะใช้มันโดยปริยาย เช่น: capturecomplete = [this](){calstage1done();}; ฉันทดสอบสิ่งนี้ใน g ++ และรวบรวมมัน C ++ มาตรฐานนี้หรือไม่ (และถ้าเป็นเช่นนั้นเวอร์ชันใด) หรือเป็นรูปแบบของส่วนขยายบางส่วน

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