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

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

3
foo (void) vs foo (void *)
ฟังก์ชั่นและการพูด syntactically มีความแตกต่างระหว่างฟังก์ชั่นที่มีต้นแบบint foo(void)และint foo(void *) ? ฉันรู้ว่าความแตกต่างระหว่างตัวอย่างเช่นint bar(int)และint bar(int *)- หนึ่งของพวกเขากำลังมองหา int และอื่น ๆ ที่กำลังมองหาตัวชี้ int มีvoidพฤติกรรมแบบเดียวกันหรือไม่?

3
ทำไม std :: atomic <T> :: is_lock_free () ไม่คงที่เช่นเดียวกับ constexpr
ใครสามารถบอกฉันว่า std :: atomic :: is_lock_free () ไม่คงที่เช่นเดียวกับ constexpr? มีมันไม่คงที่และ / หรือเป็น constexpr ไม่ได้ทำให้รู้สึกสำหรับฉัน

1
วิธีการโทรวิธีการเครื่องยนต์กระพือจากหัวข้ออื่น
ฉันใช้เดสก์ท็อปกระพือสำหรับลินุกซ์ ฉันกำลังเรียกวิธีที่เรียกMarkTextureFrameAvailableว่าควรจะทำเครื่องหมายพื้นผิวเพื่อให้เครื่องยนต์แสดงผลซ้ำ เนื่องจากฉันกำลังเขียนโปรแกรมเล่นวิดีโอฉันต้องโทรMarkTextureFrameAvailableจากเธรดของผู้เล่น ปัญหาคือเครื่องยนต์บังคับให้ฉันเรียกMarkTextureFrameAvailable(และวิธีการอื่น ๆ ของเครื่องยนต์) จากเธรดที่สร้างเครื่องยนต์ คุณจะเห็นว่าการเรียกไปยังเอ็นจิ้นทั้งหมดสิ้นสุดลงในเชลล์ซึ่งจะทำการตรวจสอบเพื่อดูว่ามีการโทรจากเธรดเดียวกันที่สร้างการโทรหรือไม่: task_runners_.GetPlatformTaskRunner()-&gt;RunsTasksOnCurrentThread() ( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 ) นี่คือวิธีที่ฉันสร้างเครื่องมือกระพือ: int main(int argc, char **argv) { //.. flutter::FlutterWindowController flutter_controller(icu_data_path); // Start the engine. if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path, arguments)) { return EXIT_FAILURE; } // Register any native plugins. FlutterWebRTCPluginRegisterWithRegistrar( flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin")); // Run until the window …

1
การใช้ C ++ AtomicInt นี้ถูกต้องหรือไม่
สถานที่ตั้ง: ผมทำงานกับ ARM ฝังตัว (เกือบเปลือยโลหะ) สภาพแวดล้อมที่ฉันไม่ได้มี C ++ 11 (กับstd::atomic&lt;int&gt;) ใช้ได้ดังนั้นโปรดหลีกเลี่ยงคำตอบเช่น " เพียงแค่ใช้มาตรฐาน C ++std::atomic&lt;int&gt; " ฉันไม่สามารถ การใช้งาน AtomicInt ARM นี้ถูกต้องหรือไม่ (ถือว่าสถาปัตยกรรม ARM คือARMv7-A ) คุณเห็นปัญหาการซิงโครไนซ์บ้างไหม? มันvolatileจำเป็น / มีประโยชน์หรือไม่? // File: atomic_int.h #ifndef ATOMIC_INT_H_ #define ATOMIC_INT_H_ #include &lt;stdint.h&gt; class AtomicInt { public: AtomicInt(int32_t init = 0) : atom(init) { } …

3
รายการ :: empty () พฤติกรรมแบบมัลติเธรด?
ฉันมีรายการที่ฉันต้องการให้เธรดต่าง ๆ หยิบองค์ประกอบ เพื่อหลีกเลี่ยงการล็อก mutex ที่ป้องกันรายการเมื่อว่างฉันempty()จะตรวจสอบก่อนล็อก ไม่เป็นไรหากการโทรไปlist::empty()ไม่ถูกต้อง 100% ของเวลา ฉันเพียงต้องการหลีกเลี่ยงการหยุดทำงานหรือรบกวนการทำงานพร้อมกันlist::push()และการlist::pop()โทร ฉันปลอดภัยempty()ไหมที่จะสมมติว่า VC ++ และ Gnu GCC บางครั้งจะผิดพลาดและไม่มีอะไรเลวร้ายไปกว่านี้ if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes mutex.lock(); if(list.empty() == false){ // check again while locked to be certain element = list.back(); list.pop_back(); } mutex.unlock(); }

3
การสร้างรหัสแลมบ์ดา C ++ พร้อมการเริ่มต้นใน C ++ 14
ฉันกำลังพยายามที่จะเข้าใจ / อธิบายรหัสโค้ดที่สร้างขึ้นเมื่อส่งผ่านการจับไปยัง lambdas โดยเฉพาะอย่างยิ่งในการจับภาพเริ่มต้นทั่วไปที่เพิ่มใน C ++ 14 ให้ตัวอย่างรหัสต่อไปนี้ด้านล่างนี้เป็นความเข้าใจปัจจุบันของฉันในสิ่งที่คอมไพเลอร์จะสร้าง กรณีที่ 1: การดักจับตามค่า / การดักจับเริ่มต้นตามค่า int x = 6; auto lambda = [x]() { std::cout &lt;&lt; x &lt;&lt; std::endl; }; จะถือเอา: class __some_compiler_generated_name { public: __some_compiler_generated_name(int x) : __x{x}{} void operator()() const { std::cout &lt;&lt; __x &lt;&lt; std::endl;} private: int __x; …
9 c++  lambda  c++14  move 


2
ไวยากรณ์ที่ถูกต้องของการเรียกใช้ pseudo-destructor สำหรับค่าคงที่แบบลอยตัว
พิจารณาโปรแกรมสาธิตต่อไปนี้ #include &lt;iostream&gt; int main() { typedef float T; 0.f.T::~T(); } Microsoft Visual Studio Community 2019โปรแกรมนี้เป็นโปรแกรมที่รวบรวมโดย แต่clangและgccออกข้อผิดพลาดเช่นนี้ prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T' 7 | 0.f.T::~T(); | ^~~~~ หากต้องการเขียนนิพจน์เช่น( 0.f ).T::~T()นั้นคอมไพเลอร์ทั้งสามจะคอมไพล์โปรแกรม ดังนั้นคำถามที่เกิดขึ้น: บันทึกนี้0.f.T::~T()ถูกต้องตามหลักไวยากรณ์หรือไม่ และถ้าไม่เช่นนั้นกฎเกี่ยวกับวากยสัมพันธ์คืออะไร?

2
สร้างข้อยกเว้นมาตรฐานด้วยอาร์กิวเมนต์ตัวชี้โมฆะและ postconditions ที่เป็นไปไม่ได้
พิจารณาโปรแกรมต่อไปนี้: #include&lt;stdexcept&gt; #include&lt;iostream&gt; int main() { try { throw std::range_error(nullptr); } catch(const std::range_error&amp;) { std::cout &lt;&lt; "Caught!\n"; } } GCC และ Clang ด้วยการโทร libstdc ++ std::terminateและยกเลิกโปรแกรมด้วยข้อความ terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid เสียงดังกราวกับ libc ++ segfaults ในการสร้างข้อยกเว้น ดูgodbolt คอมไพเลอร์ทำงานตามมาตรฐานหรือไม่ ส่วนที่เกี่ยวข้องของมาตรฐาน[diagnostics.range.error] (C ++ 17 …

2
ฉันจะคืนค่า piped ชั่วคราวไปยังการทำงานแบบ range ได้หรือไม่?
สมมติว่าฉันมีgenerate_my_rangeคลาสที่โมเดล a range(โดยเฉพาะคือregular) จากนั้นรหัสต่อไปนี้ถูกต้อง: auto generate_my_range(int some_param) { auto my_transform_op = [](const auto&amp; x){ return do_sth(x); }; return my_custom_rng_gen(some_param) | ranges::views::transform(my_transform_op); } auto cells = generate_my_range(10) | ranges::to&lt;std::vector&gt;; มีการmy_custom_rng_gen(some_param)ดำเนินการโดยมูลค่าโดย (ตอนแรก) ประกอบท่อหรือฉันจะมีการอ้างอิงห้อยเมื่อฉันออกจากgenerate_my_rangeขอบเขต? มันจะเหมือนกันกับการเรียก functionnal ranges::views::transform(my_custom_rng_gen(some_param),my_transform_op)หรือไม่? มันจะถูกต้องหรือไม่ถ้าฉันใช้การอ้างอิง lvalue เช่น: auto generate_my_range(int some_param) { auto my_transform_op = [](const auto&amp; x){ return do_sth(x); }; …
9 c++  range-v3 

1
วิธีรับจำนวนองค์ประกอบใน std :: array <T, N> โดยไม่ต้องสร้างอินสแตนซ์
มีแต่มันไม่คงที่จึงต้องใช้อินสแตนซ์ของstd::array&lt;T, N&gt;::size() std::arrayมีวิธีรับค่าที่ส่งกลับ (ซึ่งเป็นNของstd::array&lt;T, N&gt;) โดยไม่ต้องสร้างตัวอย่างของอาร์เรย์หรือไม่ สำหรับอาร์เรย์ปกติฉันสามารถใช้งานได้sizeofแต่ฉันไม่เห็นการรับประกันว่าsizeof(std::array&lt;T, N&gt;) == N * sizeof(T)จะเป็นจริง
9 c++  arrays  c++11  sizeof 

2
มีช่องว่างชื่ออะไรบ้างและมีกฎอะไรบ้าง
หมายเหตุ: คำถามนี้เป็นเรื่องเกี่ยวกับที่ไม่ได้name spacenamespace มาตรฐาน C ++ มีการอ้างอิงบางอย่างname spaceแต่ฉันไม่เห็นคำจำกัดความของสิ่งนี้ มาตรฐานบอกว่าฉลากและมาโครอยู่ในพื้นที่ชื่อที่แตกต่างกัน การอ้างอิงอื่น ๆ ทั้งหมดที่name spaceอยู่ในส่วนความเข้ากันได้ของ C / C ++ เช่นนี้ ( ฉบับร่างปัจจุบัน ): นี่เป็นหนึ่งในความไม่ลงรอยกันระหว่าง C และ C ++ ที่สามารถนำมาประกอบกับคำจำกัดความพื้นที่ชื่อ C ++ ใหม่ซึ่งสามารถประกาศชื่อเป็นชนิดและเป็นชนิดที่ไม่ใช่ชนิดในขอบเขตเดียวทำให้ชื่อที่ไม่ใช่ประเภทซ่อน ชื่อประเภทและกำหนดให้ใช้คำหลักคลาสโครงสร้างยูเนี่ยนหรือ enum เพื่ออ้างถึงชื่อประเภท การกำหนดพื้นที่ชื่อใหม่นี้ให้ความสะดวกสบายที่สำคัญแก่โปรแกรมเมอร์ C ++ และช่วยในการใช้งานประเภทที่ผู้ใช้กำหนดเองคล้ายกับการใช้งานประเภทพื้นฐาน คำจำกัดความพื้นที่ชื่อใหม่นี้คืออะไร ฉันจะหาได้ในมาตรฐาน กฎที่แน่นอนคืออะไร? กฎดูเหมือนจะซับซ้อนกว่า "ประเภทการซ่อนประเภทที่ไม่ใช่" เช่นนี้ไม่ได้รวบรวม: typedef int Foo; // Foo is a …
9 c++  namespaces 

1
มันเป็น UB ที่จะกลับมาทำงานเป็นสมาชิก coroutine ของวัตถุที่อายุการใช้งานสิ้นสุดลงหรือไม่?
คำถามนี้เกิดจากความคิดเห็นนี้: คำอธิบายตลอดอายุการใช้งานแลมบ์ดาสำหรับ coroutines C ++ 20 เกี่ยวกับตัวอย่างนี้: auto foo() -&gt; folly::coro::Task&lt;int&gt; { auto task = []() -&gt; folly::coro::Task&lt;int&gt; { co_return 1; }(); return task; } ดังนั้นคำถามคือการดำเนินการ coroutine กลับโดยfooจะส่งผลใน UB "การเรียก" ฟังก์ชันสมาชิก (หลังจากสิ้นสุดอายุการใช้งานของวัตถุ) คือ UB: http://eel.is/c++draft/basic.life#6.2 ... ตัวชี้ใด ๆ ที่แสดงที่อยู่ของที่เก็บสินค้าซึ่งวัตถุนั้นจะเป็นหรือที่ตั้งอาจถูกนำมาใช้ แต่ในรูปแบบที่ จำกัด เท่านั้น [... ] โปรแกรมมีพฤติกรรมที่ไม่ได้กำหนดหาก: [ ... ] - ตัวชี้ใช้เพื่อเข้าถึงสมาชิกข้อมูลที่ไม่คงที่หรือเรียกใช้ฟังก์ชันสมาชิกแบบไม่คงที่ของวัตถุหรือ …

1
การสร้างวัตถุโดยนัยที่ไม่ระบุ
เนื่องจากP0593 การสร้างวัตถุโดยปริยายสำหรับการจัดการวัตถุระดับต่ำได้รับการยอมรับวัตถุจึงอาจถูกสร้างโดยนัยใน C ++ 20 โดยเฉพาะถ้อยคำที่นำโดยข้อเสนอที่จะช่วยให้การดำเนินการบางอย่าง (เช่นstd::malloc) เพื่อสร้างโดยอัตโนมัติและเริ่มต้นชีวิตของวัตถุบางชนิดที่เรียกว่าประเภทนัยชีวิต , ถ้าการแนะนำของวัตถุดังกล่าวจะทำให้โปรแกรมที่มีพฤติกรรมที่ไม่ได้กำหนดไว้เป็นอย่างอื่นที่จะมี พฤติกรรมที่กำหนดไว้ ดู[intro.object] / 10 ตอนนี้ร่างเพิ่มเติมกล่าวว่าหากมีหลายชุดของวัตถุดังกล่าวที่สามารถสร้างขึ้นโดยปริยายเพื่อให้พฤติกรรมที่กำหนดโปรแกรมมันจะไม่ได้ระบุชุดของชุดเหล่านี้จะถูกสร้างขึ้น (ดูเหมือนว่าประโยคที่เกี่ยวข้องจะไม่ปรากฏในการแก้ไขข้อเสนอล่าสุดที่ฉันสามารถเข้าถึงได้ R5 แต่อยู่ในร่างข้อตกลง) จริง ๆ แล้วมีโปรแกรมที่ตัวเลือกของชุดวัตถุที่สร้างขึ้นโดยปริยายนี้สามารถสังเกตได้หรือไม่? ในคำอื่น ๆ มีโปรแกรมที่มีการกำหนด แต่ไม่ได้ระบุพฤติกรรมผ่านกฎใหม่นี้เช่นว่ามันเป็นไปได้ที่จะอนุมานจากการส่งออกซึ่งชุดประเภทของวัตถุโดยปริยาย (มากกว่าหนึ่งที่เป็นไปได้มากกว่าหนึ่ง) ถูกสร้างขึ้น? หรือประโยคนี้มีความหมายเพียงเพื่อชี้แจงการดำเนินการของโปรแกรมบนเครื่องนามธรรม (โดยไม่มีผลกระทบที่สังเกตได้)?

2
ทำไม C ++ deduce T ในการโทรไปยัง Foo <T> :: Foo (T&&) ไม่ได้?
รับโครงสร้างแม่แบบต่อไปนี้: template&lt;typename T&gt; struct Foo { Foo(T&amp;&amp;) {} }; การคอมไพล์นี้และTถูกอนุมานว่าเป็นint: auto f = Foo(2); แต่สิ่งนี้ไม่ได้รวบรวม: https://godbolt.org/z/hAA9TE int x = 2; auto f = Foo(x); /* &lt;source&gt;:12:15: error: no viable constructor or deduction guide for deduction of template arguments of 'Foo' auto f = Foo(x); ^ &lt;source&gt;:7:5: note: candidate function [with …

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