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

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

2
จะกำหนดไฟล์ส่วนหัวที่จะรวมได้อย่างไร?
สมมติว่าฉันมีรหัสด้านล่าง (ง่ายมาก) #include <iostream> int main() { std::cout << std::stoi("12"); } สิ่งนี้รวบรวมได้ดีทั้ง g ++ และ clang; อย่างไรก็ตามมันไม่สามารถคอมไพล์บน MSVC ด้วยข้อผิดพลาดต่อไปนี้: ข้อผิดพลาด C2039: 'stoi': ไม่ใช่สมาชิกของ 'std' ข้อผิดพลาด C3861: 'stoi': ไม่พบตัวระบุ ฉันรู้ว่าstd::stoiมันเป็นส่วนหนึ่งของ<string>ส่วนหัวซึ่งน่าจะเป็นสิ่งที่คอมไพเลอร์อดีตสองคนรวมอยู่ในส่วนของ<iostream>และส่วนหลังไม่ได้ ตามมาตรฐาน C ++ [res.on.headers] ส่วนหัว C ++ อาจรวมส่วนหัว C ++ อื่น ๆ ซึ่งสำหรับฉันแล้วโดยทั่วไปบอกว่าคอมไพเลอร์ทั้งสามนั้นถูกต้อง ปัญหานี้เกิดขึ้นเมื่อนักเรียนคนหนึ่งของฉันส่งงานซึ่ง TA ทำเครื่องหมายว่าไม่รวบรวม ฉันไปแล้วแน่นอน อย่างไรก็ตามฉันต้องการป้องกันเหตุการณ์ในอนาคตเช่นนี้ ดังนั้นมีวิธีการตรวจสอบไฟล์ส่วนหัวที่ควรจะรวมถึงการรวบรวมในสามคอมไพเลอร์ที่แตกต่างกันเพื่อตรวจสอบทุกครั้งหรือไม่ วิธีเดียวที่ฉันคิดได้ก็คือเพื่อให้แน่ใจว่าสำหรับstdการเรียกใช้ฟังก์ชันทุกครั้งจะมีการรวมที่เหมาะสม แต่ถ้าคุณมีรหัสที่มีอยู่ซึ่งมีความยาวหลายพันบรรทัดการค้นหาอาจน่าเบื่อ …
13 c++ 

1
ทำไมประเภทนิพจน์จึงเปลี่ยนเป็น C ++ ระหว่างเวอร์ชัน?
ฉันพยายามที่จะเข้าใจประเภทการแสดงออกของ C ++ และยิ่งฉันอ่านยิ่งฉันสับสนมากขึ้นเนื่องจากฉันพบว่า C ++ ร่างยากมากที่จะแยกย่อยและดังนั้นจึงชอบแหล่งข้อมูลอื่น แต่พวกเขาขัดแย้งกันหรือไม่คำนึงว่า ถ้อยคำและคำจำกัดความระหว่างเวอร์ชัน C ++ มีการเปลี่ยนแปลงอย่างมาก ในต่อไปนี้ฉันหมายถึงร่างต่อไปนี้: C ++ 11 [ n3690 ] (ร่างสุดท้าย) C ++ 17 [ n4659 ] (ร่างสุดท้าย) C ++ 20 [ n4835 ] (ร่างปัจจุบัน) C++11 3.10 ค่าและค่า ... prvalue (“ pure” rvalue) คือ rvalue ที่ไม่ใช่ xvalue [ตัวอย่าง: ผลลัพธ์ของการเรียกฟังก์ชั่นที่มีประเภทส่งคืนไม่ใช่การอ้างอิงคือ prvalue ค่าของตัวอักษรเช่น …
13 c++  c++11  c++14  c++17  c++20 

1
ตัวดำเนินการที่คลุมเครือใน gcc
ฉันสร้างเทมเพลตฟังก์ชันสำหรับการพิมพ์คอนเทนเนอร์ stl บางส่วน #include <iostream> #include <vector> #include <string> template <template <typename, typename> class C, typename T, typename A> std::ostream& operator<<(std::ostream& os, const C<T, A>& container) { for (auto& elem : container) { os << elem << " "; } return os; } int main() { std::vector<std::string> v { "One", …
13 c++  c++17 

2
ทำ Derived1 :: ฐานและ Derived2 :: ฐานอ้างถึงชนิดเดียวกันหรือไม่
MSVC, Clang และ GCC ไม่เห็นด้วยกับรหัสนี้: struct Base { int x; }; struct Der1 : public Base {}; struct Der2 : public Base {}; struct AllDer : public Der1, public Der2 { void foo() { Der1::Base::x = 5; } }; Godbolt GCC: <source>: In member function 'void AllDer::foo()': <source>:10:21: error: 'Base' …

1
เหตุใดตัวแปร extern แบบโลคอลในบล็อกที่แตกต่างกันจึงได้รับการเชื่อมโยงที่แตกต่างกันระหว่างคอมไพเลอร์ใน c ++
ในขณะที่ฉันกำลังตรวจสอบว่ามีการเชื่อมโยงใด บ้างที่อนุญาตให้ตัวแปรท้องถิ่นภายนอกฉันพบว่าพฤติกรรมที่แตกต่างระหว่างคอมไพเลอร์ เช่นถ้าฉันทดสอบโค้ดด้านล่าง ตามที่คุณเห็นในตัวแปรข้อคิดเห็นvarมีลิงค์ต่างกัน // foo.cpp int var = 10; // external linkage // main.cpp #include <iostream> static int var = 100; // internal linkage int main() { extern int var; // internal linkage std::cout << var << std::endl; { extern int var; // g++: external linkage , clang++: internal …
12 c++  g++  clang++  extern  linkage 

1
`equality_comparable_with` จำเป็นต้องใช้` common_reference` หรือไม่?
แนวคิดequality_­comparable_with<T, U>มีจุดมุ่งหมายที่จะประกาศวัตถุชนิดที่TและUสามารถนำมาเปรียบเทียบเท่ากับแต่ละอื่น ๆ และถ้าพวกเขาอยู่แล้วนี้มีความหมายที่คาดหวัง ไม่เป็นไร. อย่างไรก็ตามแนวคิดนี้ยังต้องcommon_reference_t<T&, U&>มีอยู่ แรงกระตุ้นหลักสำหรับcommon_referenceและฟังก์ชั่นการดูแลของมันดูเหมือนว่าจะเปิดใช้งานตัวทำซ้ำพร็อกซีเพื่อให้มีสถานที่ที่จะเป็นตัวแทนของความสัมพันธ์ระหว่างreferenceและvalue_typeสำหรับการทำซ้ำดังกล่าว เยี่ยมมาก แต่ ... สิ่งใดที่เกี่ยวข้องกับการทดสอบว่า a Tและ a Uสามารถเปรียบเทียบกันได้หรือไม่ ทำไมมาตรฐานจึงต้องการสิ่งนั้นTและUมีความสัมพันธ์อ้างอิงร่วมกันเพียงเพื่อให้คุณสามารถเปรียบเทียบพวกเขาได้เท่ากัน? สิ่งนี้จะสร้างสถานการณ์คี่บอลซึ่งเป็นการยากมากที่จะมีสองประเภทซึ่งไม่มีเหตุผลพอสมควรที่มีความสัมพันธ์อ้างอิงทั่วไปที่เทียบเคียงได้ในเชิงตรรกะ ตัวอย่างเช่นvector<int>และpmr::vector<int>เหตุผลควรเปรียบเทียบ แต่ไม่สามารถทำได้เพราะไม่มีการอ้างอิงทั่วไปที่สมเหตุสมผลระหว่างสองประเภทที่ไม่เกี่ยวข้องกัน

1
พฤติกรรมที่ไม่ได้กำหนดเป็นไปได้ในการใช้งาน static_vector ดั้งเดิม
tl; dr: ฉันคิดว่า static_vector ของฉันมีพฤติกรรมที่ไม่ได้กำหนด แต่ฉันหามันไม่พบ ปัญหานี้เกิดขึ้นกับ Microsoft Visual C ++ 17 ฉันมีการใช้งาน static_vector ที่เรียบง่ายและไม่สมบูรณ์เช่นเวกเตอร์ที่มีความจุคงที่ที่สามารถจัดสรรสแต็กได้ นี่คือโปรแกรม C ++ 17 โดยใช้ std :: aligned_storage และ std :: launder ฉันพยายามต้มลงไปด้านล่างเพื่อชิ้นส่วนที่ฉันคิดว่าเกี่ยวข้องกับปัญหา: template <typename T, size_t NCapacity> class static_vector { public: typedef typename std::remove_cv<T>::type value_type; typedef size_t size_type; typedef T* pointer; typedef const T* …

2
เป็นไปได้หรือไม่ที่จะรวมสองสตริงประเภท `` `` `` `` `ณ เวลารวบรวม?
เห็นได้ชัดว่าเราสามารถต่อสตริงตัวอักษรสองตัวเข้าด้วยกันในconstexprฟังก์ชั่น แต่สิ่งที่เกี่ยวกับการเรียงตัวอักษรสตริงกับสตริงที่ส่งกลับโดยconstexprฟังก์ชั่นอื่นเช่นในรหัสด้านล่าง? template <class T> constexpr const char * get_arithmetic_size() { switch (sizeof(T)) { case 1: return "1"; case 2: return "2"; case 4: return "4"; case 8: return "8"; case 16: return "16"; default: static_assert(dependent_false_v<T>); } } template <class T> constexpr std::enable_if_t<std::is_arithmetic_v<T>, const char *> make_type_name() { const char …
12 c++  c++17 

1
C ++ 20 การกำหนดนอกคลาสในเทมเพลตคลาส
จนถึงมาตรฐาน C ++ 20 ของ C ++ เมื่อเราต้องการกำหนดโอเปอเรเตอร์นอกคลาสซึ่งใช้สมาชิกส่วนตัวของคลาสเทมเพลตเราจะใช้โครงสร้างที่คล้ายกับสิ่งนี้: template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr Foo(T k) : mK(k) {} constexpr friend bool operator==<T>(T lhs, const Foo& rhs); private: T mK; }; template <typename …
12 c++  templates  c++20 

1
แลมบ์ดาที่ไม่มีการรับประกันรับประกันว่าจะว่างเปล่าตามมาตรฐานหรือไม่?
ฉันกำลังค้นหาวิธีที่จะระบุ lambdas ที่ว่างเปล่า (ไม่มีขอบเขต) จาก lambdas อื่น ๆ ในฟังก์ชั่นเทมเพลต ปัจจุบันฉันใช้ C ++ 17 แต่ฉันอยากรู้คำตอบ C ++ 20 ด้วย รหัสของฉันมีลักษณะเช่นนี้: template<typename T> auto func(T lambda) { // The aguments of the lambdas are unknown if constexpr (/* is captureless */) { // do stuff } } มันรับประกันโดยมาตรฐาน C ++ (17 หรือ …
12 c++  lambda  c++17  c++20 

1
สิ่งที่ป้องกันการทับซ้อนกันของสมาชิกที่อยู่ติดกันในชั้นเรียน?
พิจารณาสามstructs ต่อไปนี้: class blub { int i; char c; blub(const blub&) {} }; class blob { char s; blob(const blob&) {} }; struct bla { blub b0; blob b1; }; บนแพลตฟอร์มทั่วไปที่intมีขนาด 4 ไบต์ขนาดการจัดตำแหน่งและระยะห่างรวม1เป็นดังนี้: struct size alignment padding -------- ------ ----------- --------- blub 8 4 3 blob 1 1 0 bla …

2
เหตุใดตัวแปร enum จึงเป็นค่าที่นี่
ตัวอย่าง: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันรวบรวมสิ่งนี้: <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type …

1
ผู้จัดการแพ็คเกจ Linux จะจัดการกับโมดูล C ++ 20 อย่างไร
เราอยู่ในปี 2020 และ C ++ 20 กำลังจะมาพร้อมกับคุณสมบัติโมดูล C ++ ที่รอคอยมานาน แต่หลังจากดูการพูดคุยกับ CppCon ไม่กี่ครั้งฉันพบว่าโมดูล C ++ อยู่ในสถานที่แปลก ๆ โดยเฉพาะอย่างยิ่งสำหรับผู้จัดการแพ็คเกจ Linux (pacman, apt, โผล่ออกมา ฯลฯ ) จากสิ่งที่ฉันได้เรียนรู้โมดูล C ++ คือ คอมไพเลอร์ขึ้นอยู่กับ คุณไม่สามารถใช้โมดูลที่สร้างโดย GCC ใน Clang โมดูล GCC 9.1 จะไม่ทำงานบน GCC 9.2 คุณสามารถมีโมดูลเดียวกันหลายรุ่น ตราบใดที่ยังไม่ถูกส่งออกไปยังขอบเขตเดียวกัน คุณต้องสร้างโมดูลขึ้นใหม่หากการพึ่งพาของมันอัพเดต ปัญหาของฉันคือในการรวบรวม distros คอมไพเลอร์ทั้งหมดได้รับการปรับปรุงตลอดเวลาและผู้ใช้อาจมีการสร้างคอมไพเลอร์ของตัวเอง ในปัจจุบันสามารถอัพเดตคอมไพเลอร์หรืออัพเดตlibstdc++ได้ แต่ด้วยโมดูลดูเหมือนว่าจะแนะนำให้libstdc++มีการปรับปรุงเมื่อคอมไพเลอร์ปรับปรุง ตัวจัดการแพ็กเกจจะจัดการกับการอัพเดตอย่างไรเช่น STL เมื่อคอมไพเลอร์อัพเดต …

1
นามแฝงสาธารณะสำหรับประเภทที่ไม่ใช่สาธารณะ
ฉันสงสัยว่ามันถูกต้อง C ++: class Test { struct PrivateInner { PrivateInner(std::string const &str) { std::cout << str << "\n"; } }; public: using PublicInner = PrivateInner; }; //Test::PrivateInner priv("Hello world"); // Ok, private so we can't use that Test::PublicInner publ("Hello World"); // ?, by using public alias we can access private …

1
เป็นไปไม่ได้ที่จะจัดคลาสคลาสชื่ออย่างเต็มที่ในตัวประกาศนอกคลาสของนิยามฟังก์ชัน
โปรแกรมนี้ส่งผลให้เกิดการแยกวิเคราะห์ความโลภที่ไม่ต้องการ: struct float4x4 {}; class C { float4x4 M(); }; float4x4 ::C::M() { return float4x4{}; } : 8: 1: ข้อผิดพลาด: ไม่มีสมาชิกชื่อ 'C' ใน 'float4x4'; คุณหมายถึง 'C' อย่างง่ายๆหรือเปล่า float4x4 :: C :: M () ^ ~~~~~~~~~~~ ซึ่งสามารถ 'แก้ไข' โดยใช้ประเภทการส่งคืนต่อท้าย: auto ::C::M() -> float4x4 {} ตอนนี้ทุกอย่างดี ดังนั้นฉันคิดว่าเราไม่สามารถผ่านการรับรอง class-name เมื่อใช้ไวยากรณ์

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