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

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

1
ความแตกต่างของอินสแตนซ์ constexpr สองตัวของตัวชี้ __func__ ยังคงเป็น constexpr หรือไม่
นี่คือ C ++ ที่ถูกต้องหรือไม่ int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC และ MSVC คิดว่ามันตกลงดังกราวคิดว่ามันไม่ได้: คอมไพเลอร์ Explorer ที่ คอมไพเลอร์ทุกคนยอมรับว่าอันนี้ตกลง: คอมไพเลอร์ Explorer ที่ int main() { constexpr auto p = __func__; constexpr auto p2 = p; constexpr auto sz = p2 - p; return sz; …

1
นี่เป็นข้อบกพร่องใน std :: gcd หรือไม่
ฉันเจอพฤติกรรมนี้std::gcdซึ่งฉันพบว่าไม่คาดคิด: #include <iostream> #include <numeric> int main() { int a = -120; unsigned b = 10; //both a and b are representable in type C using C = std::common_type<decltype(a), decltype(b)>::type; C ca = std::abs(a); C cb = b; std::cout << a << ' ' << ca << '\n'; std::cout << …


1
if constexpr - เพราะเหตุใดคำสั่งที่ถูกยกเลิกจะถูกตรวจสอบอย่างสมบูรณ์?
ฉันยุ่งกับ c ++ 20 consteval ใน GCC 10 และเขียนรหัสนี้ #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&& pred, Tuple&& t) noexcept { constexpr std::size_t I = std::tuple_size_v<std::decay_t<decltype(t)>> - N; if constexpr (N == 0u) { return std::nullopt; } else { return pred(std::get<I>(t)) …

2
เหตุใดเราไม่สามารถสร้างวัตถุที่สร้างขึ้นได้เล็กน้อยโดยใช้ malloc หากตัวสร้างปริยายของ trivial ไม่ทำงาน?
ฉันมีปัญหาในการทำความเข้าใจย่อหน้าต่อไปนี้ที่อ้างอิงจากcppreferenceเกี่ยวกับConstructorปริยาย ฉันค้นหา stackoverflow แล้วแต่ยังไม่ได้รับคำตอบที่ชัดเจน ได้โปรดช่วยด้วย คอนสตรัคค่าเริ่มต้นเล็กน้อยเป็นตัวสร้างที่ไม่มีการดำเนินการ ชนิดข้อมูลทั้งหมดที่เข้ากันได้กับภาษา C (ชนิด POD) สามารถเริ่มต้นสร้างได้เล็กน้อย ซึ่งแตกต่างจากใน C อย่างไรก็ตามวัตถุที่มีตัวสร้างเริ่มต้นเล็กน้อยไม่สามารถสร้างได้โดยการแปลหน่วยความจำที่สอดคล้องกันอย่างเหมาะสมเช่นหน่วยความจำที่จัดสรรด้วย std :: malloc: การจัดวางตำแหน่งใหม่จำเป็นต้องแนะนำวัตถุใหม่อย่างเป็นทางการ โดยเฉพาะอย่างยิ่งถ้านวกรรมิกเริ่มต้นเล็กน้อยไม่ทำอะไรเลยทำไมเราไม่สามารถตีความการจัดเก็บและตีความว่ามีวัตถุที่มีประเภทที่กำหนด คุณช่วยยกตัวอย่างสำหรับพฤติกรรมที่ไม่ได้กำหนดซึ่งอาจเป็นสาเหตุได้หรือไม่?

5
วิธีการจัดกลุ่มหรือการพับคู่ของชุดพารามิเตอร์?
template<class Msg, class... Args> std::wstring descf(Msg, Args&&... args) { std::wostringstream woss; owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all //or owss << Msg << ". " << args[0] << ": '" << args[1] << …

2
คัดลอกและย้ายเพื่อนอัตโนมัติสร้างหรือไม่
เราสามารถเข้าถึงตัวแปรส่วนตัวของคลาสอื่นได้เมื่อเรากำหนด copy หรือ move constructors C ++ ทำให้พวกเขาfriendกันโดยอัตโนมัติหรือไม่? ตัวอย่างเช่น: my_str::my_str(my_str&& m) { size_ = m.size_; //accessing private variable another my_str class buff_ = m.buff_; //accessing private variable another my_str class m.buff_ = nullptr; m.size_ = 0; }
14 c++  friend-class 

3
ชื่อคลาสที่ผ่านการรับรองโดยสมบูรณ์ถึงขอบเขตทั่วโลกที่จำเป็นสำหรับคำจำกัดความของฟังก์ชั่นสมาชิกนอกบรรทัดหรือไม่?
คำถามนี้ทำให้ฉันสงสัยว่ามันมีประโยชน์ / จำเป็นสำหรับชื่อคลาสที่มีคุณสมบัติครบถ้วน (รวมถึงตัวดำเนินการขอบเขตทั่วโลก) ในนิยามฟังก์ชันฟังก์ชันสมาชิกนอกคลาสหรือไม่ ในมือข้างหนึ่งฉันไม่เคยเห็นสิ่งนี้มาก่อน (และไวยากรณ์ในการทำอย่างถูกต้องดูเหมือนคลุมเครือ) ในอีกด้านหนึ่งการค้นหาชื่อ C ++ นั้นไม่ใช่เรื่องเล็กน้อยดังนั้นอาจมีกรณีเล็ก ๆ น้อย ๆ คำถาม: มีกรณีที่แนะนำคำนิยามฟังก์ชั่นสมาชิกนอกคลาสโดย ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... } จะแตกต่างจาก ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }(ไม่มี::คำนำหน้าขอบเขตทั่วโลก)? โปรดทราบว่าคำจำกัดความของฟังก์ชันสมาชิกจะต้องใส่ไว้ในเนมสเปซที่ล้อมรอบคลาสดังนั้นนี่ไม่ใช่ตัวอย่างที่ถูกต้อง

3
เหตุใดส่วนมิติของอาร์เรย์จึงเป็นชนิดข้อมูล
ในขณะที่อ่านหนังสือ C ++ Primer ฉันเจอข้อความนี้: "จำนวนองค์ประกอบในอาเรย์เป็นส่วนหนึ่งของประเภทอาเรย์" ดังนั้นฉันต้องการค้นหาโดยใช้รหัสต่อไปนี้: #include<iostream> int main() { char Array1[]{'H', 'e', 'l', 'p'}; char Array2[]{'P', 'l', 'e', 'a', 's', 'e'}; std::cout<<typeid(Array1).name()<<std::endl; //prints A4_c std::cout<<typeid(Array2).name()<<std::endl; //prints A6_c return 0; } และน่าสนใจที่ผลลัพธ์ของ typeid ในสองอาร์เรย์แสดงว่ามันแตกต่างกัน เบื้องหลังเกิดอะไรขึ้น เหตุใดจึงจำเป็นต้องให้อาร์เรย์มีชนิดที่มีขนาด เป็นเพราะขนาดไม่ควรเปลี่ยนแปลงหรือไม่ สิ่งนี้จะส่งผลกระทบต่อการเปรียบเทียบอาร์เรย์? เพียงแค่ต้องการที่จะสามารถเข้าใจแนวคิดอย่างลึกซึ้ง
14 c++  arrays  c++11 

2
GCC9 หลีกเลี่ยงสถานะไร้ค่าของ std :: variant ที่อนุญาตหรือไม่
ฉันเพิ่งติดตามการสนทนา Reddit ซึ่งนำไปสู่การเปรียบเทียบที่ดีของstd::visitการเพิ่มประสิทธิภาพในคอมไพเลอร์ ฉันสังเกตเห็นสิ่งต่อไปนี้: https://godbolt.org/z/D2Q5ED ทั้ง GCC9 และ Clang9 (ฉันเดาว่าพวกเขาแบ่งปัน stdlib เดียวกัน) ไม่ได้สร้างรหัสสำหรับการตรวจสอบและการโยนข้อยกเว้นที่ไม่มีค่าเมื่อทุกประเภทเป็นไปตามเงื่อนไขบางประการ สิ่งนี้นำไปสู่วิธีที่ดีกว่า codegen ดังนั้นฉันยกปัญหากับ MSVC STL และถูกนำเสนอด้วยรหัสนี้: template <class T> struct valueless_hack { struct tag {}; operator T() const { throw tag{}; } }; template<class First, class... Rest> void make_valueless(std::variant<First, Rest...>& v) { try { v.emplace<0>(valueless_hack<First>()); } catch(typename …

3
เหตุใด“ ++ i ++” จึงไม่ถูกต้องในขณะที่ (++ i) ++ นั้นถูกต้อง?
ลองพิจารณารหัสต่อไปนี้: int main() { int i = 2; int b = ++i++; return 3; } มันรวบรวมด้วยต่อไปนี้มีข้อผิดพลาด: <source>: In function 'int main()': <source>:3:16: error: lvalue required as increment operand 3 | int b = ++i++; | ^~ มันฟังดูยุติธรรมสำหรับฉัน การเพิ่มขึ้นของ Postfix มีลำดับความสำคัญสูงกว่าการเพิ่มคำนำหน้าดังนั้นจึงมีการแยกวิเคราะห์รหัสint b = ++(i++);และiเป็น rvalue ดังนั้นข้อผิดพลาด ลองพิจารณาตัวแปรนี้ด้วยวงเล็บเพื่อแทนที่ลำดับความสำคัญเริ่มต้น: int main() { int …

2
อะไรคือจุดในการรู้ว่าวัตถุนั้นเป็นส่วนประกอบหรือไม่หรือเป็นประเภทของชั้นเรียนหรือไม่?
สวัสดีฉันเคยเห็นตัวอย่างมากมายใน Cppreference.com: std::is_class<T> std::is_integral และอื่น ๆ ฉันรู้ว่าถ้าผมเรียกใช้รหัสเช่นฉันจะได้รับหรือtrue falseแต่ประเด็นคืออะไร เช่นรู้ว่าวัตถุเป็นประเภทของชั้นเรียนหรือไม่? #include <iostream> #include <type_traits> struct A {}; class B {}; enum class C {}; int main() { std::cout << std::boolalpha; std::cout << std::is_class<A>::value << '\n'; std::cout << std::is_class<B>::value << '\n'; std::cout << std::is_class<C>::value << '\n'; std::cout << std::is_class<int>::value << '\n'; } …
14 c++  templates 

1
เหตุใด std :: swap จึงไม่ทำงานบนองค์ประกอบเวกเตอร์ <bool> ใน Clang / Win
ฉันมีรหัสเช่นนี้: #include &lt;vector&gt; #include &lt;utility&gt; int main() { std::vector&lt;bool&gt; vb{true, false}; std::swap(vb[0], vb[1]); } ข้อโต้แย้งเกี่ยวกับความมีสติvector&lt;bool&gt;นอกเหนือจากนี้สิ่งนี้ใช้ได้ผลดีกับ: เสียงดังกราวสำหรับ Mac Visual Studio สำหรับ Windows GCC สำหรับ Linux จากนั้นฉันพยายามสร้างด้วย Clang บน Windows และได้รับข้อผิดพลาดต่อไปนี้ (ย่อ): error: no matching function for call to 'swap' std::swap(vb[0], vb[1]); ^~~~~~~~~ note: candidate function [with _Ty = std::_Vb_reference&lt;std::_Wrap_alloc&lt;std::allocator&lt;unsigned int&gt; &gt; …

1
เครื่องมือสร้างช่วงเวกเตอร์สามารถเรียกการแปลงที่ชัดเจนได้หรือไม่
โปรแกรมต่อไปนี้มีรูปแบบที่ดีหรือไม่ #include &lt;vector&gt; struct A { explicit A(int) {} }; int main() { std::vector&lt;int&gt; vi = {1, 2, 3, 4, 5}; std::vector&lt;A&gt; va(vi.begin(), vi.end()); } ตาม C ++ 17 [sequence.reqmts] ข้อกำหนดสำหรับ X u(i, j); โดยที่Xเป็นคอนเทนเนอร์ลำดับคือ: Tจะต้องEmplaceConstructibleเข้ามาจากX*i อย่างไรก็ตามในวรรคก่อนมีการระบุว่า: iและjiterators แสดงว่าความพึงพอใจของข้อกำหนดของข้อมูล iterator และการอ้างอิงถึงองค์ประกอบโดยปริยายแปลงสภาพให้แก่value_type, ดังนั้นฉันคิดว่าข้อกำหนดทั้งสองจะต้องเป็นไปตาม: ประเภทค่าของช่วงจะต้องสามารถแปลงเป็นประเภทค่าของคอนเทนเนอร์โดยปริยายและ EmplaceConstructibleต้องเป็นที่พอใจ . เนื่องจากintไม่สามารถแปลงเป็นปริยายได้Aโปรแกรมนี้จึงควรมีรูปแบบไม่ดี แต่น่าแปลกใจที่ดูเหมือนว่าจะรวบรวมภายใต้ GCC
14 c++  c++17 

3
โอเวอร์โหลดฟังก์ชั่นแลมบ์ดา
วิธีโอเวอร์โหลดฟังก์ชั่นแลมบ์ดาแบบง่าย ๆ ในท้องถิ่น? SSE ของปัญหาดั้งเดิม: #include &lt;iostream&gt; #include &lt;map&gt; void read() { static std::string line; std::getline(std::cin, line); auto translate = [](int idx) { constexpr static int table[8]{ 7,6,5,4,3,2,1,0 }; return table[idx]; }; auto translate = [](char c) { std::map&lt;char, int&gt; table{ {'a', 0}, {'b', 1}, {'c', 2}, {'d', 3}, {'e', …

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