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

C ++ 17 เป็นชื่อของมาตรฐาน C ++ ที่ได้รับการอนุมัติในปี 2017 มันสร้างตามมาตรฐาน C ++ 14 ก่อนหน้าปรับปรุงภาษาแกนกลางและไลบรารีมาตรฐานและเพิ่มคุณสมบัติภาษาใหม่บางอย่าง

3
ฉันจะสร้างวิธีที่ประเภทรายการคาร์ทีเซียนใน C ++ ได้อย่างไร
อธิบายตนเอง โดยพื้นฐานแล้วฉันมีรายการประเภทดังนี้: using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; พวกเขาสามารถเป็นจำนวนชนิดรายการ ฉันจะพิมพ์ดีดของผลิตภัณฑ์คาร์ทีเซียนได้อย่างไร result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; ฉันตะลุยวิธีการสร้างผลิตภัณฑ์คาร์ทีเซียนแบบสองทางตามที่กำหนดไว้ที่นี่: วิธีสร้างผลิตภัณฑ์คาร์ทีเซียนของรายการประเภท แต่ดูเหมือนไม่มีทางน่ารำคาญเลย ตอนนี้ฉันกำลังพยายาม ... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... …

3
deleter ของ shared_ptr ถูกเก็บไว้ในหน่วยความจำที่จัดสรรโดยตัวจัดสรรที่กำหนดเองหรือไม่
บอกว่าผมมีshared_ptrกับการจัดสรรที่กำหนดเองและ Deleter ที่กำหนดเอง ฉันไม่สามารถหาอะไรในมาตรฐานที่พูดถึงว่าควรเก็บ deleter ที่ไหน: ไม่ได้บอกว่าตัวจัดสรรแบบกำหนดเองจะถูกใช้สำหรับหน่วยความจำของ deleter และมันไม่ได้บอกว่ามันจะไม่เป็นเช่นนั้น สิ่งนี้ไม่ได้ระบุหรือฉันเพิ่งจะพลาดบางสิ่ง

4
การแปลงโดยปริยายไม่ได้รับอนุญาตเมื่อส่งคืน
#include <optional> bool f() { std::optional<int> opt; return opt; } ไม่ได้รวบรวม: 'return': cannot convert from 'std::optional<int>' to 'bool' การอ้างอิงการให้คำปรึกษาฉันคิดว่าจะหาคำอธิบาย แต่ฉันอ่านมันควรจะโอเค การแปลงโดยนัยจะดำเนินการทุกครั้งที่มีการใช้นิพจน์ประเภท T1 บางประเภทในบริบทที่ไม่ยอมรับประเภทนั้น แต่ยอมรับประเภท T2 บางประเภท โดยเฉพาะอย่างยิ่ง: เมื่อนิพจน์ใช้เป็นอาร์กิวเมนต์เมื่อเรียกใช้ฟังก์ชันที่ประกาศด้วย T2 เป็นพารามิเตอร์ เมื่อนิพจน์ถูกใช้เป็นตัวถูกดำเนินการกับตัวดำเนินการที่คาดว่า T2 เมื่อเริ่มต้นวัตถุใหม่ประเภท T2 รวมถึงคำสั่ง return ในฟังก์ชั่นการคืนค่า T2 เมื่อการแสดงออกที่ใช้ในงบสวิทช์ (T2 เป็นประเภทที่สำคัญ); เมื่อนิพจน์ถูกใช้ในคำสั่ง if หรือลูป (T2 คือบูล)

3
แบ่ง std :: variant type ที่กำหนดตามเกณฑ์ที่กำหนด
วิธีการตามประเภทของตัวแปรที่กำหนด using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>; ประกาศสองประเภทที่แตกต่าง using V1 = std::variant<bool, char, int, float, double>; using V2 = std::variant<std::string, std::vector<int>>; ซึ่งV1รวมถึงประเภทคณิตศาสตร์ทั้งหมดจากVและV2รวมประเภทที่ไม่ใช่คณิตศาสตร์ทั้งหมดมาจากVไหน V สามารถเป็นพารามิเตอร์ของคลาสแม่แบบตัวอย่างเช่น: template <class V> struct TheAnswer { using V1 = ?; using V2 = ?; }; โดยทั่วไปเกณฑ์สามารถเป็นconstexprตัวแปรเช่นนี้: template <class T> constexpr bool filter;
20 c++  c++17  std-variant 

1
ประเภทเทมเพลตและความกำกวมกลับอัตโนมัติ
ฉันมีฟังก์ชั่นเทมเพลตมากเกินไป: template<typename T1, typename T2> auto overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; } template<typename RT, typename T1, typename T2> RT overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; …

4
ใช้กับ std :: transform กับ std :: back_inserter ได้ไหม
Cppreference มีโค้ดตัวอย่างนี้สำหรับstd::transform: std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); แต่มันก็พูดว่า: std::transformไม่ได้รับประกันการประยุกต์ใช้ในการสั่งซื้อของหรือunary_op เมื่อต้องการใช้ฟังก์ชั่นลำดับในการสั่งซื้อหรือจะใช้ฟังก์ชั่นที่ปรับเปลี่ยนองค์ประกอบของลำดับการใช้งานbinary_opstd::for_each นี่น่าจะอนุญาตให้มีการใช้งานแบบขนาน อย่างไรก็ตามพารามิเตอร์ที่สามของstd::transformคือLegacyOutputIteratorซึ่งมี postcondition ต่อไปนี้สำหรับ++r: หลังจากการดำเนินการrนี้ไม่จำเป็นต้องเพิ่มและสำเนาใด ๆ ของค่าก่อนหน้าของrไม่จำเป็นต้องถูกยกเลิกหรือเพิ่มเติม สำหรับฉันแล้วดูเหมือนว่าการกำหนดผลลัพธ์จะต้องเกิดขึ้นตามลำดับ พวกเขาหมายถึงว่าแอปพลิเคชันunary_opอาจไม่เป็นระเบียบและจัดเก็บในตำแหน่งชั่วคราว แต่คัดลอกไปยังเอาต์พุตตามลำดับหรือไม่ ไม่ได้ดูเหมือนสิ่งที่คุณอยากจะทำ ไลบรารี C ++ ส่วนใหญ่ยังไม่ได้ใช้ตัวจัดการแบบขนานจริง ๆ แต่ Microsoft มี ผมค่อนข้างมั่นใจว่านี้เป็นรหัสที่เกี่ยวข้องและผมคิดว่ามันสายนี้populate()ฟังก์ชั่นการบันทึกเพื่อ iterators ชิ้นของการส่งออกซึ่งก็ไม่ได้เป็นสิ่งที่ถูกต้องที่จะทำเพราะ LegacyOutputIteratorสามารถจะถูกยกเลิกโดยการเพิ่มสำเนาของมัน ฉันกำลังคิดถึงอะไร

1
เหตุใด std :: atomic constructor จึงมีความแตกต่างใน C ++ 14 และ C ++ 17
ฉันทำงานในโครงการที่มี C ++ 11 และฉันลองใช้รหัสต่อไปนี้ #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } ฉันได้รับข้อผิดพลาดของคอมไพเลอร์ error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ ผลลัพธ์เดียวกันคือกับ C ++ 14 เมื่อฉันเปลี่ยนเป็น C ++ 17 มันใช้งานได้: wandbox ฉันตรวจสอบความแตกต่างของ cppreference: …
19 c++  c++14  c++17  stdatomic 

4
enum C ++ ต่อเนื่อง 11
มีวิธีการเช็คอินใน C ++ 11 ไหมถ้า enum ต่อเนื่องหรือไม่? มันถูกต้องอย่างสมบูรณ์เพื่อให้ค่า enum ที่ไม่ได้ อาจมีคุณสมบัติเช่นลักษณะประเภทใน C ++ 14, C ++ 17 หรืออาจ C ++ 20 เพื่อตรวจสอบว่า enum เป็นแบบต่อเนื่องหรือไม่ สิ่งนี้จะใช้ใน static_assert ตัวอย่างเล็ก ๆ ดังนี้: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, …
17 c++  c++11  c++14  c++17  c++20 

1
gotchas ใด ๆ ที่แทนที่ global const char [] ด้วย constexpr string_view?
ทีมงานของเรากำลังทำงานกับรหัสฐาน C ++ อายุมากกว่า 10 ปีและเพิ่งเปลี่ยนเป็นคอมไพเลอร์ C ++ 17 ดังนั้นเรากำลังมองหาวิธีปรับปรุงรหัสของเราให้ทันสมัย ในการพูดคุยประชุมบน YouTube ผมได้ยินข้อเสนอแนะเพื่อแทนที่สตริงระดับโลกที่มีconst char*constexpr string_view เนื่องจากเรามีconst char*ค่าคงที่สตริงทั่วโลกจำนวนมากในรหัสของเราฉันต้องการถามว่ามี gotchas หรือปัญหาที่อาจเกิดขึ้นที่เราต้องระวังหรือไม่?

1
std :: pair <auto, auto> return type
ผมเล่นรอบกับในauto std::pairในรหัสด้านล่างฟังก์ชั่นfควรจะส่งกลับstd::pairประเภทซึ่งขึ้นอยู่กับพารามิเตอร์แม่แบบ ตัวอย่างการทำงาน: ตัวอย่าง 1 template &lt;unsigned S&gt; auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return std::pair{1.0, 2.0}; // pair of doubles else return std::pair{0.0f, 0.0f}; // pair of floats } ใช้งานได้กับ gcc 9.2, gcc 10.0, …

1
คอมไพเลอร์ c ++ จะหาตัวแปรภายนอกได้อย่างไร
ฉันรวบรวมโปรแกรมนี้โดย g ++ และ clang ++ มีความแตกต่าง: g ++ พิมพ์ 1 แต่พิมพ์ clang ++ 2 ดูเหมือนว่า g ++: var var ที่กำหนดไว้ในขอบเขตที่สั้นที่สุด clang ++: ตัวแปร extern ถูกกำหนดในขอบเขตโกลบอลที่สั้นที่สุด ข้อมูลจำเพาะ C ++ มีข้อกำหนดใด ๆ main.cpp #include &lt;iostream&gt; static int i; static int *p = &amp;i; int main() { int i; { extern int …

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 &lt;iostream&gt; #include &lt;numeric&gt; int main() { int a = -120; unsigned b = 10; //both a and b are representable in type C using C = std::common_type&lt;decltype(a), decltype(b)&gt;::type; C ca = std::abs(a); C cb = b; std::cout &lt;&lt; a &lt;&lt; ' ' &lt;&lt; ca &lt;&lt; '\n'; std::cout &lt;&lt; …

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

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

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