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

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

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', …

1
การใช้ c ++ nullptr ทำงานอย่างไร
ฉันอยากรู้ว่าnullptrทำงานอย่างไร มาตรฐาน N4659 และ N4849 พูดว่า: มันจะต้องมีประเภทstd::nullptr_t; คุณไม่สามารถใช้ที่อยู่ของมัน มันสามารถแปลงเป็นตัวชี้และตัวชี้ไปยังสมาชิกโดยตรง sizeof(std::nullptr_t) == sizeof(void*); การแปลงboolเป็นfalse; ค่าของมันสามารถแปลงเป็นประเภทอินทิกรัลเหมือนกัน(void*)0แต่ไม่ย้อนหลัง ดังนั้นมันจึงเป็นค่าคงที่ที่มีความหมายเหมือน(void*)0กัน แต่มีชนิดที่แตกต่างกัน ฉันพบการใช้งานstd::nullptr_tบนอุปกรณ์ของฉันและเป็นดังนี้ #ifdef _LIBCPP_HAS_NO_NULLPTR _LIBCPP_BEGIN_NAMESPACE_STD struct _LIBCPP_TEMPLATE_VIS nullptr_t { void* __lx; struct __nat {int __for_bool_;}; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator int __nat::*() const {return …

2
ถ้า constexpr ที่มี static_assert ในแลมบ์ดาคอมไพเลอร์ตัวไหนถูกต้อง?
เมื่อเราต้องการที่จะใช้static_assertในif constexprเราจะต้องทำให้เงื่อนไขขึ้นอยู่กับพารามิเตอร์แม่แบบบางอย่าง น่าสนใจ gcc และเสียงดังกราวไม่เห็นด้วยเมื่อโค้ดถูกห่อในแลมบ์ดา โค้ดต่อไปนี้คอมไพล์ด้วย gcc แต่เสียงดังกราวกระตุ้นการยืนยันแม้ว่าif constexprจะไม่เป็นจริงก็ตาม #include &lt;utility&gt; template&lt;typename T&gt; constexpr std::false_type False; template&lt;typename T&gt; void foo() { auto f = [](auto x) { constexpr int val = decltype(x)::value; if constexpr(val &lt; 0) { static_assert(False&lt;T&gt;, "AAA"); } }; f(std::integral_constant&lt;int, 1&gt;{}); } int main() { foo&lt;int&gt;(); } ตัวอย่างที่อาศัยอยู่ที่นี่ …

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 &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; template &lt;template &lt;typename, typename&gt; class C, typename T, typename A&gt; std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const C&lt;T, A&gt;&amp; container) { for (auto&amp; elem : container) { os &lt;&lt; elem &lt;&lt; " "; } return os; } int main() { std::vector&lt;std::string&gt; v { "One", …
13 c++  c++17 

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

2
เป็นไปได้หรือไม่ที่จะรวมสองสตริงประเภท `` `` `` `` `ณ เวลารวบรวม?
เห็นได้ชัดว่าเราสามารถต่อสตริงตัวอักษรสองตัวเข้าด้วยกันในconstexprฟังก์ชั่น แต่สิ่งที่เกี่ยวกับการเรียงตัวอักษรสตริงกับสตริงที่ส่งกลับโดยconstexprฟังก์ชั่นอื่นเช่นในรหัสด้านล่าง? template &lt;class T&gt; 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&lt;T&gt;); } } template &lt;class T&gt; constexpr std::enable_if_t&lt;std::is_arithmetic_v&lt;T&gt;, const char *&gt; make_type_name() { const char …
12 c++  c++17 

1
แลมบ์ดาที่ไม่มีการรับประกันรับประกันว่าจะว่างเปล่าตามมาตรฐานหรือไม่?
ฉันกำลังค้นหาวิธีที่จะระบุ lambdas ที่ว่างเปล่า (ไม่มีขอบเขต) จาก lambdas อื่น ๆ ในฟังก์ชั่นเทมเพลต ปัจจุบันฉันใช้ C ++ 17 แต่ฉันอยากรู้คำตอบ C ++ 20 ด้วย รหัสของฉันมีลักษณะเช่นนี้: template&lt;typename T&gt; 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
วิธีการที่ทันสมัยในการทำให้ std :: vector จัดสรรหน่วยความจำที่จัดตำแหน่งไว้
คำถามต่อไปนี้เป็นเรื่องที่เกี่ยวข้อง แต่คำตอบที่มีความเก่าแก่และความคิดเห็นจากผู้ใช้มาร์ค Glisseแสดงให้เห็นมีวิธีการใหม่ตั้งแต่ C ++ 17 เพื่อแก้ไขปัญหานี้ที่อาจจะไม่ได้รับการกล่าวถึงอย่างเพียงพอ ฉันกำลังพยายามให้หน่วยความจำที่ทำงานสอดคล้องกันอย่างถูกต้องสำหรับ SIMD ในขณะที่ยังคงสามารถเข้าถึงข้อมูลทั้งหมดได้ ใน Intel ถ้าฉันสร้างเวกเตอร์ลอยชนิด__m256และลดขนาดลง 8 เท่ามันจะทำให้ฉันมีหน่วยความจำที่สอดคล้องกัน เช่น std::vector&lt;__m256&gt; mvec_a((N*M)/8); ในทางที่แฮ็กเล็กน้อยฉันสามารถชี้พอยน์เตอร์ไปยังองค์ประกอบเวกเตอร์เพื่อลอยตัวซึ่งทำให้ฉันสามารถเข้าถึงค่าลอยตัวส่วนบุคคล แต่ฉันต้องการให้มีการstd::vector&lt;float&gt;จัดตำแหน่งที่ถูกต้องและสามารถโหลดลงใน__m256และ SIMD ประเภทอื่น ๆ ได้โดยไม่ต้องแบ่งไฟล์ ฉันได้รับการมองเข้าไปในaligned_alloc นี่สามารถให้อาเรย์แบบ C ที่จัดเรียงอย่างถูกต้อง: auto align_sz = static_cast&lt;std::size_t&gt; (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); อย่างไรก็ตามฉันไม่แน่ใจว่าจะทำเช่นนี้std::vector&lt;float&gt;ได้อย่างไร ให้std::vector&lt;float&gt;เป็นเจ้าของไม่ได้ดูเหมือนจะเป็นไปได้marr_a ฉันเคยเห็นคำแนะนำบางอย่างที่ฉันควรเขียนตัวจัดสรรแบบกำหนดเองแต่ดูเหมือนว่าจะทำงานได้มากและบางทีด้วย C ++ ที่ทันสมัยมีวิธีที่ดีกว่า

1
Unqualified sort () - ทำไมมันรวบรวมเมื่อใช้กับ std :: vector และไม่ได้อยู่ในอาร์เรย์ std :: และคอมไพเลอร์ใดที่ถูกต้อง?
เมื่อโทรstd::sort()บนstd::array: #include &lt;vector&gt; #include &lt;array&gt; #include &lt;algorithm&gt; int main() { std::vector&lt;int&gt; foo{4, 1, 2, 3}; sort(begin(foo), end(foo)); std::array&lt;int, 4&gt; foo2{4, 1, 2, 3}; sort(begin(foo2), end(foo2)); } ทั้ง gcc และ clang ส่งคืนข้อผิดพลาดในการเรียงลำดับบนstd::array- clang กล่าว ข้อผิดพลาด: การใช้ตัวระบุที่ไม่ได้ประกาศ 'sort'; หมายถึง 'std :: sort' หรือเปล่า การเปลี่ยนเป็นการstd::sort(begin(foo2), end(foo2))แก้ไขปัญหา MSVC รวบรวมรหัสข้างต้นตามที่เขียนไว้ ทำไมความแตกต่างในการรักษาระหว่างstd::vectorและstd::array; และคอมไพเลอร์ตัวใดที่ถูกต้อง?
11 c++  c++17 

1
ตัวแปรอินไลน์สามารถเปลี่ยนแปลงได้หลังจากการเริ่มต้นใน C ++ 17 หรือไม่
สถานการณ์ของฉันเป็นดังต่อไปนี้ (มันทำงานในเสียงดังกราว แต่ไม่ได้อยู่ใน gcc) liba.hpp: inline int MY_GLOBAL = 0; libother.cpp: (dll) #include "myliba.hpp" void myFunc() { // MYGLOBAL = 28; } someexe.cpp: RunAppThatUsesBothLibAandLibOther(); ปัญหาคือตัวแปรอินไลน์แสดง 0 ในสถานที่ที่ฉันคาดไว้ 28 เพราะมันถูกแก้ไขอย่างมากในเวลาทำงาน MSVC ไม่เห็นด้วยกับสิ่งนี้ แต่เสียงดังทำตามที่ฉันคาดไว้ คำถามคือ: สามารถแก้ไขตัวแปรอินไลน์ในเวลาทำงานในสถานการณ์ของฉันได้หรือไม่ (ฉันแก้ไขปัญหาโดยการลบตัวแปรออกไป)
11 c++  visual-c++  dll  clang  c++17 

6
ช่วงไร้เดียงสาที่ใช้สำหรับลูปไม่ทำงาน
ต่อไปนี้ไม่ได้รวบรวม: #include &lt;iostream&gt; int main() { int a{},b{},c{},d{}; for (auto&amp; s : {a, b, c, d}) { s = 1; } std::cout &lt;&lt; a &lt;&lt; std::endl; return 0; } ลองใช้กับ godbolt ข้อผิดพลาดของคอมไพเลอร์คือ: error: assignment of read-only reference 's' ตอนนี้ในกรณีของฉันจริงรายการทำจากตัวแปรสมาชิกในชั้นเรียน ทีนี้มันไม่ได้ผลเพราะนิพจน์กลายเป็นinitializer_list&lt;int&gt;สิ่งที่คัดลอก a, b, c และ d - ดังนั้นจึงไม่อนุญาตให้ทำการดัดแปลง คำถามของฉันคือสองเท่า: มีแรงจูงใจเบื้องหลังที่ไม่ยอมให้เขียนช่วงสำหรับลูปด้วยวิธีนี้หรือไม่? เช่น. …

2
weak_ptr reset ส่งผลต่อ shared_ptr หรือไม่
ฉันไม่ค่อยชินกับการใช้มากนักweak_ptrและฉันกำลังเผชิญกับสถานการณ์ที่ค่อนข้างสับสน ฉันกำลังใช้การอัพเดท Intel XE 2019 นักแต่งเพลง 5 ( แพ็คเกจ 2019.5.281 ) เมื่อรวมกันกับVisual Studio 2019 เวอร์ชั่น 16.2.5 ฉันรวบรวมใน 64 บิต ผมใช้มาตรฐานC ++ 17 นี่คือรหัสสำหรับการแก้ปัญหาขัดขวางของฉัน: #include &lt;memory&gt; #include &lt;iostream&gt; using namespace std; int main( int argc, char* argv[] ) { shared_ptr&lt;int&gt; sp = make_shared&lt;int&gt;( 42 ); cout &lt;&lt; "*sp = " &lt;&lt; …

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