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

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

5
การเชื่อมโยงแบบไดนามิก - Vs Linux ของ windows
ใน Windows เมื่อฉันรวบรวมรหัส C / C ++ ในโครงการ DLL ใน MSVC ฉันได้รับ 2 ไฟล์: MyDll.dll MyDll.lib ที่เท่าที่ฉันเข้าใจMyDll.libมีชนิดของตารางตัวชี้ที่ระบุตำแหน่งฟังก์ชั่นใน dll เมื่อใช้ dll นี้พูดในไฟล์ exe MyDll.libจะถูกฝังลงในไฟล์ exe ในระหว่างการเชื่อมโยงดังนั้นในขณะรันไทม์มัน "รู้" ซึ่งฟังก์ชั่นตั้งอยู่ในMyDll.dllและสามารถใช้งานได้ แต่ถ้าฉันรวบรวมรหัสเดียวกันภายใต้ Linux ฉันได้รับเพียงไฟล์เดียวMySo.soโดยไม่ MySo.a(เทียบเท่ากับlibไฟล์ใน Linux) ดังนั้นไฟล์ปฏิบัติการภายใต้ Linux รู้ได้อย่างไรว่าฟังก์ชั่นตั้งอยู่ที่ไหนMySo.soถ้าไม่มีอะไรฝังอยู่ในระหว่างการเชื่อมโยง?

2
มีวิธีในการสร้าง stringstream จาก string_view โดยไม่คัดลอกข้อมูลหรือไม่
ฉันคิดว่านั่นเป็นคำถามที่ค่อนข้างตรงไปตรงมา ฉันต้องการใช้โดยเฉพาะstd::get_timeแต่ต้องการกระแสข้อมูลบางประเภทเพื่อใช้กับ ฉันกำลังส่งผ่านข้อมูลในstring_viewและต้องการหลีกเลี่ยงการคัดลอกเพียงเพื่อแยกวันที่

2
วิธีการแปลงอาร์เรย์ numpy เป็น vector <int> & (อ้างอิง) ด้วย SWIG
เป้าหมายของฉัน: สร้าง 3 numpy arrays ใน python (2 อันจะถูกเตรียมค่าเริ่มต้นด้วยค่าเฉพาะ) จากนั้นส่งทั้งสามตัวผ่าน swig ไปยังฟังก์ชัน c ++ เป็นเวกเตอร์ อ้างอิง (นี่คือเพื่อหลีกเลี่ยงการคัดลอกข้อมูลและประสิทธิภาพการสูญเสีย) เมื่ออยู่ในฟังก์ชัน c ++ ให้เพิ่ม 2 อาร์เรย์และใส่ผลรวมลงในอาร์เรย์ที่ 3 vec_ref.h #include &lt;vector&gt; #include &lt;iostream&gt; void add_vec_ref(std::vector&lt;int&gt;&amp; dst, std::vector&lt;int&gt;&amp; src1, std::vector&lt;int&gt;&amp; src2); vec_ref.cpp #include "vec_ref.h" #include &lt;cstring&gt; // need for size_t #include &lt;cassert&gt; void add_vec_ref(std::vector&lt;int&gt;&amp; dst, …
10 python  c++  numpy  vector  swig 

4
ทำไม int x {y = 5} จึงเป็นไปได้
int main() { int y; int x{ y = 5 }; //x is 5 } สิ่งนี้เป็นไปได้อย่างไรเนื่องจาก y = 5 ไม่ใช่นิพจน์ที่คำนวณได้? นอกจากนี้ทำไมคอมไพเลอร์หรือ IDE ไม่บ่นเกี่ยวกับ main () ไม่ส่งคืน int

1
SFINAE ใช้ VoidT กับคอมไพเลอร์ต่าง ๆ นำไปสู่ผลลัพธ์ที่ต่างกัน
พิจารณารหัสต่อไปนี้: template &lt;typename T&gt; using VoidT = void; class A { public: using TEST = int; }; class C { public: using DIFFERENT = int; }; template &lt;typename T, typename Enable = void&gt; class B { public: B() = delete; }; template &lt;typename T&gt; class B&lt;T, VoidT&lt;typename T::TEST&gt;&gt; { public: …
10 c++ 

2
จะเกิดอะไรขึ้นถ้าพฤติกรรม C ++ ที่ไม่ได้กำหนดตรงกับพฤติกรรมที่กำหนดไว้ C?
ฉันมี*.cppไฟล์ที่คอมไพล์ด้วย C ++ (ไม่ใช่คอมไพเลอร์ C) ฟังก์ชั่นที่มีอยู่อาศัยนักแสดง (ดูบรรทัดสุดท้าย) ซึ่งดูเหมือนว่าจะถูกกำหนดใน C (โปรดแก้ไขถ้าฉันผิด!) แต่ไม่ใช่ใน C ++ สำหรับประเภทพิเศษนี้ [...] C++ code [...] struct sockaddr_in sa = {0}; int sockfd = ...; sa.sin_family = AF_INET; sa.sin_port = htons(port); bind(sockfd, (struct sockaddr *)&amp;sa, sizeof sa); [...] C++ code [...] เนื่องจากฉันคอมไพล์ไฟล์นี้ในไฟล์ C ++ ตอนนี้มันเป็นพฤติกรรมที่กำหนดหรือไม่ได้กำหนดหรือไม่? หรือฉันจะต้องย้ายสิ่งนี้เป็น*.cไฟล์เพื่อให้มันเป็นพฤติกรรมที่กำหนดไว้?

2
C ++ - เหตุใดจึงต้องใช้คำหลัก 'เทมเพลต' ที่นี่
ฉันมีรหัสต่อไปนี้: template &lt;typename TC&gt; class C { struct S { template &lt;typename TS&gt; void fun() const {} }; void f(const S&amp; s) { s.fun&lt;int&gt;(); } }; // Dummy main function int main() { return 0; } เมื่อมีการสร้างนี้มีทั้ง GCC 9.2 และเสียงดังกราว (9.0) ฉันได้รับการรวบรวมข้อผิดพลาดเนื่องจากการคำหลักที่ถูกต้องสำหรับการกล่าวอ้างtemplate funเสียงดังกราวแสดง: error: use 'template' keyword to treat 'fun' …

2
อะไรรับประกันกับ C ++ std :: atomic ในระดับโปรแกรมเมอร์?
ฉันได้ฟังและอ่านบทความพูดคุยและคำถามเกี่ยวกับสแต็คโอเวอร์โฟลว์หลายเรื่องstd::atomicแล้วและฉันต้องการให้แน่ใจว่าฉันเข้าใจดี เนื่องจากฉันยังสับสนอยู่เล็กน้อยกับบรรทัดแคชเขียนการมองเห็นเนื่องจากความล่าช้าที่เป็นไปได้ในโปรโตคอลการเชื่อมโยงกันของแคช MESI (หรือที่ได้รับ) บัฟเฟอร์ที่เก็บบัฟเฟอร์คิวที่ไม่ถูกต้องและอื่น ๆ ฉันอ่าน x86 มีโมเดลหน่วยความจำที่แรงกว่าและหากการตรวจสอบความถูกต้องแคชล่าช้า x86 สามารถยกเลิกการดำเนินการที่เริ่มต้นได้ แต่ตอนนี้ฉันสนใจเฉพาะสิ่งที่ฉันควรถือว่าเป็นโปรแกรมเมอร์ C ++ ซึ่งเป็นอิสระจากแพลตฟอร์ม [T1: thread1 T2: thread2 V1: ตัวแปรอะตอมมิกที่ใช้ร่วมกัน] ฉันเข้าใจว่า std :: atomic รับประกันว่า (1) ไม่มีการแย่งข้อมูลในตัวแปร (ต้องขอบคุณการเข้าถึงสายแคชเท่านั้น) (2) หน่วยความจำที่เราใช้นั้นขึ้นอยู่กับหน่วยความจำที่รับประกันว่า (มีสิ่งกีดขวาง) ซึ่งความสอดคล้องตามลำดับจะเกิดขึ้น (3) หลังจากการเขียนอะตอมมิก (V1) บน T1 อะตอมมิก RMW (V1) บน T2 จะสอดคล้องกัน (บรรทัดแคชจะได้รับการอัพเดตด้วยค่าที่เขียนบน T1) แต่เมื่อไพรเมอร์เชื่อมโยงกันถึงแคช ความหมายของสิ่งเหล่านี้คือโดยค่าเริ่มต้นการโหลดสามารถดึงข้อมูลเก่า (ถ้าคำขอการตรวจสอบความถูกต้องที่สอดคล้องกันกำลังนั่งอยู่ในคิวการตรวจสอบความถูกต้อง) ดังนั้นถูกต้องหรือไม่ …

1
GCC ล้มเหลวในการรายงานการโทรแลมบ์ดาแบบ constexpr ที่ไม่เหมาะสม
ด้านล่างเป็นสองกรณีทดสอบสำหรับพฤติกรรมที่ไม่ได้กำหนดซึ่งแสดงเป็น IIFE (เรียกว่า Lambda-Axpression ทันที): constexpr auto test3 = []{ int* p{}; { int x{}; p = &amp;x; } return *p; // Undefined Behaviour }(); // IIFE constexpr auto test4 = []{ int x = std::numeric_limits&lt;int&gt;::min(); int y = -x; // Undefined Behaviour return y; }(); int main() {} เมื่อรวบรวมกับ …

1
การแปลงเป็นโมฆะ ** บนคอมไพเลอร์ต่างกัน
ฉันใช้รหัสต่อไปนี้ผ่านคอมไพเลอร์ต่าง ๆ : int main() { float **a; void **b; b = a; } จากสิ่งที่ฉันได้รับสามารถที่จะรวบรวมvoid **เป็นไม่ได้เป็นตัวชี้ทั่วไปซึ่งหมายความว่าการแปลงใด ๆ จากตัวชี้อีกไม่ควรรวบรวมหรืออย่างน้อยโยนเตือน อย่างไรก็ตามนี่คือผลลัพธ์ของฉัน (ทำบน Windows): gcc - ส่งคำเตือนตามที่คาดไว้ g ++ - โยนข้อผิดพลาดตามที่คาดไว้ (นี่เป็นเพราะการพิมพ์ที่อนุญาตน้อยกว่าของ C ++ ใช่ไหม?) MSVC (cl.exe) - ไม่มีการเตือนใด ๆ แม้จะมีการระบุ / Wall คำถามของฉันคือ: ฉันขาดอะไรบางอย่างเกี่ยวกับสิ่งทั้งปวงและมีเหตุผลเฉพาะที่ทำให้ MSVC ไม่สร้างคำเตือนหรือไม่? MSVC ไม่ผลิตเตือนเมื่อมีการแปลงจาก ไปvoid **float ** สิ่งที่ควรทราบอีกประการหนึ่ง: …
9 c++  c  cuda 

1
ผ่านตัวชี้ฟังก์ชั่นจากอาร์เรย์ของตัวชี้ฟังก์ชั่นเป็นอาร์กิวเมนต์แม่แบบ
ฉันต้องการผ่านตัวชี้ฟังก์ชั่นจากอาร์เรย์ของตัวชี้ฟังก์ชั่นเป็นอาร์กิวเมนต์แม่แบบ รหัสของฉันดูเหมือนว่าจะรวบรวมโดยใช้ MSVC แม้ว่า Intellisense บ่นว่ามีบางอย่างผิดปกติ ทั้ง gcc และ clang ไม่สามารถคอมไพล์โค้ดได้ ลองพิจารณาตัวอย่างต่อไปนี้: static void test() {} using FunctionPointer = void(*)(); static constexpr FunctionPointer functions[] = { test }; template &lt;FunctionPointer function&gt; static void wrapper_function() { function(); } int main() { test(); // OK functions[0](); // OK wrapper_function&lt;test&gt;(); // OK wrapper_function&lt;functions[0]&gt;(); …
9 c++  templates  c++14 

1
shift_right () ตั้งใจจะนำไปใช้ใน C ++ 20 อย่างไร
ใน C ++ 20 &lt;algorithm&gt;กำไรส่วนหัวทั้งสองขั้นตอนวิธีการใหม่และshift_left() shift_right()ทั้งสองคนยอมรับ LegacyForwardIterator ใด ๆ สำหรับshift_left()มันระบุไว้ว่า "การเคลื่อนไหวจะดำเนินการเพื่อเพิ่มการiเริ่มต้นจาก​0"; สำหรับshift_right()มันมีการระบุว่า "ถ้าForwardItตรงตามความต้องการ LegacyBidirectionalIterator แล้วย้ายจะดำเนินการในลำดับที่ลดลงของการiเริ่มต้นจากlast - first - n - 1" ฉันคิดว่าวิธีง่าย ๆ ที่จะใช้shift_left(): template &lt;typename ForwardIt&gt; constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits&lt;ForwardIt&gt;::difference_type n) { if (n &lt;= 0) return last; ForwardIt it = first; for (; …

3
unique_ptr <0 หรือผู้ปฏิบัติงานทำอะไรน้อยกว่า
ฉันกำลังจัดการกับรหัสที่ฉันไม่ได้เขียน ฉันมีคำสั่งนี้: // p is type of std::unique_ptr&lt;uint8_t[]&gt; if (p &lt; 0) { /* throw an exception */ } ดังนั้นp &lt; 0ในบริบทนี้หมายความว่าอย่างไร บนหน้าเอกสารผมเชื่อว่ากรณีของฉันเป็น16) y &lt; nullptrที่เป็น0nullptr แต่มันจะทำอะไร?

1
เสียงดังกราว / gcc ในความเชี่ยวชาญเฉพาะทางของชั้นเรียน
ฉันเจอปัญหานี้ในขณะที่พยายามชำนาญtuple_size/ tuple_elementสำหรับคลาสที่กำหนดเองใน C ++ 17 สำหรับการโยงโครงสร้าง โค้ดด้านล่างรวบรวมใน GCC แต่ไม่ใช่ในเสียงดังกราว (ทั้งรุ่นลำตัวดูที่ลิงค์ด้านล่าง) #include &lt;type_traits&gt; template&lt;typename T, typename... Ts&gt; using sfinae_t = T; template&lt;typename T, bool... Bs&gt; using sfinae_v_t = sfinae_t&lt;T, typename std::enable_if&lt;Bs&gt;::type...&gt;; template &lt;typename T&gt; struct Test; template &lt;typename T&gt; struct Test&lt;sfinae_v_t&lt;T, std::is_integral_v&lt;T&gt;&gt;&gt; {}; void f() { Test&lt;int&gt; t; } https://godbolt.org/z/ztuRSq นี่คือข้อผิดพลาดที่จัดทำโดยเสียงดังกราว: …

5
วิธีคืนข้อมูลประเภทที่ถูกต้องในแม่แบบ?
#include &lt;iostream&gt; using namespace std; template &lt;class X, class Y&gt; Y big(X a, Y b) { if (a &gt; b) return (a); else return (b); } int main() { cout &lt;&lt; big(32.8, 9); } นี่ฉันกำลังใช้แม่แบบใน CPP ดังนั้นเมื่อผมเรียกใช้ฟังก์ชันbigผ่านการขัดแย้งของdoubleและประเภทผมต้องการคำตอบกลับมาซึ่งเป็นint doubleประเภทของที่นี่ก็จะส่งกลับแทน3232.8 ฉันจะได้รับผลลัพธ์ที่ต้องการได้อย่างไร จะเขียนbigฟังก์ชั่นการส่งคืนที่เหมาะสมได้อย่างไร?

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