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

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

2
std :: set object เก็บในหน่วยความจำอย่างต่อเนื่องหรือไม่?
ไม่std::setวัตถุที่เก็บไว้ในหน่วยความจำที่ต่อเนื่องกันเช่นstd::vector? ฉันไม่สามารถค้นหาสิ่งนี้บนเว็บได้ cppreference ไม่ได้กล่าวถึงรายละเอียดเกี่ยวกับการจัดสรรหน่วยความจำ แต่ฉันไม่เห็นว่าทำไมมันไม่สามารถใช้หน่วยความจำต่อเนื่องดังนั้นคำถามของฉัน
16 c++  set  stdset 

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
sizeof (enum) สามารถแตกต่างจาก sizeof (std :: รากฐาน_type <Enum> :: type) ได้หรือไม่
เมื่อเร็ว ๆ นี้เกิดขึ้นในการตรวจสอบรหัสที่ในตัวอย่างต่อไปนี้: enum class A : uint8_t { VAL1, VAL2 }; ... std::vector&lt;A&gt; vOfA; // Assume this is sized and full of some stuff. std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A)); เราควรจะใช้แทนsizeof(std::underlying_type&lt;A&gt;::type) เป็นไปได้ไหมว่าสิ่งเหล่านี้จะแตกต่างกันไป? มีใครบางคนอ้างมาตรฐานที่รับประกันสิ่งนี้หรือไม่?sizeof(A)

3
เทมเพลต Variadic: เปิดเผยอาร์กิวเมนต์ในกลุ่ม
ฉันมีฟังก์ชั่นที่รับสองอาร์กิวเมนต์: template &lt;typename T1, typename T2&gt; void foo(T1 arg1, T2 arg2) { std::cout &lt;&lt; arg1 &lt;&lt; " + " &lt;&lt; arg2 &lt;&lt; '\n'; } และอีกหนึ่งตัวแปรที่ควรส่งต่อข้อโต้แย้งเป็นคู่: template &lt;typename... Args&gt; void bar(Args&amp;&amp;... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward&lt;Args&gt;(args), std::forward&lt;Args&gt;(args) ), ... ); // ^ Sends each argument twice, …

2
[[no_unique_address]] และสองค่าสมาชิกประเภทเดียวกัน
ฉันกำลังเล่นกับสิ่งต่อไปนี้[[no_unique_address]]ในc++20 ในตัวอย่างในcppreferenceเรามีประเภทEmptyและประเภทที่ว่างเปล่าZ struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; เห็นได้ชัดว่าขนาดของZต้องมีอย่างน้อย2เพราะประเภทe1และe2เหมือนกัน อย่างไรก็ตามฉันต้องการมีZขนาด1จริงๆ นี้มีฉันคิดสิ่งที่เกี่ยวกับการวางรูปภาพEmptyในชั้นเรียนเสื้อคลุมบางคนที่มีพารามิเตอร์แม่แบบพิเศษที่บังคับใช้ประเภทต่าง ๆและe1e2 template &lt;typename T, int i&gt; struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper&lt;Empty,1&gt; e1; [[no_unique_address]] Wrapper&lt;Empty,2&gt; e2; }; น่าเสียดาย, sizeof(Z1)==2. มีเคล็ดลับในการทำให้ขนาดZ1เป็นที่หนึ่งหรือไม่? ฉันกำลังทดสอบสิ่งนี้ด้วยgcc version 9.2.1และclang …

3
เหตุใด destructor ไม่ถูกเรียกในตัวดำเนินการลบ
ฉันพยายามโทร::deleteหาชั้นเรียนที่อยู่ในoperator deleteนั้น แต่ตัวทำลายจะไม่ถูกเรียก ฉันกำหนดคลาสMyClassที่operator deleteมีการโหลดมากเกินไป ทั่วโลกoperator deleteก็มีมากเกินไป มากเกินไปoperator deleteของจะโทรมากเกินไปทั่วโลกMyClassoperator delete class MyClass { public: MyClass() { printf("Constructing MyClass...\n"); } virtual ~MyClass() { printf("Destroying MyClass...\n"); } void* operator new(size_t size) { printf("Newing MyClass...\n"); void* p = ::new MyClass(); printf("End of newing MyClass...\n"); return p; } void operator delete(void* p) { printf("Deleting …

1
ทำไมฟังก์ชั่น consteval ถึงมีพฤติกรรมที่ไม่ได้กำหนดไว้?
มีคุณสมบัติที่เป็นระเบียบมากของนิพจน์คงที่ใน C ++: การประเมินของพวกเขาไม่สามารถมีพฤติกรรมที่ไม่ได้กำหนด ( 7.7.4.7 ): นิพจน์ e เป็นนิพจน์ค่าคงที่หลักเว้นแต่ว่าการประเมิน e ตามกฎของเครื่องนามธรรม ([intro.execution]) จะประเมินข้อใดข้อหนึ่งต่อไปนี้: ... การดำเนินการที่จะมีพฤติกรรมที่ไม่ได้กำหนดตามที่ระบุไว้ใน [บทนำ] ถึง [cpp] ของเอกสารนี้ [หมายเหตุ: รวมถึงตัวอย่างเช่นจำนวนเต็มล้นลงนาม ([expr.prop]) บางตัวชี้ทางคณิตศาสตร์ ([expr.add]) การหารด้วยศูนย์หรือการเลื่อนบางอย่าง - หมายเหตุท้าย]; การพยายามเก็บค่าของ13!ในข้อผิดพลาดconstexpr intจริงทำให้คอมไพล์คอมไพล์ดี : constexpr int f(int n) { int r = n--; for (; n &gt; 1; --n) r *= n; return …

9
Catalina C ++: การใช้ <cmath> ส่วนหัวให้ข้อผิดพลาด: ไม่มีสมาชิกชื่อ 'signbit' ในเนมสเปซส่วนกลาง
หลังจากอัปเกรดเป็น Catalina จากโมฮาวีการตั้งค่า: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk ใน env ฉันไม่สามารถคอมไพล์โปรแกรมที่ใช้&lt;cmath&gt;ส่วนหัว ฉันลองเปลี่ยน CFLAGS, CCFLAGS, CXXFLAGS ให้ชี้ไปที่ตำแหน่ง MacOSSDK ที่ไม่เปลี่ยนแปลงอะไรเลย Scanning dependencies of target OgreMain /Applications/Xcode.app/Contents/Developer/usr/bin/make -f OgreMain/CMakeFiles/OgreMain.dir/build.make OgreMain/CMakeFiles/OgreMain.dir/build [ 0%] Building CXX object OgreMain/CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o cd /Users/roman/Downloads/ogre-1.12.2/build/OgreMain &amp;&amp; /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DOgreMain_EXPORTS -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OSX -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include/Threading -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src -I/Users/roman/Downloads/ogre-1.12.2/build/Dependencies/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include -I/Users/roman/Downloads/ogre-1.12.2/build/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain -isystem /usr/local/include -Wall -Winit-self -Wcast-qual -Wwrite-strings -Wextra -Wundef …

5
วิธีสร้างการเปลี่ยนแปลงใน c ++ โดยใช้ STL สำหรับจำนวนที่ต่ำกว่าความยาวทั้งหมด
ฉันมีc++ vectorกับstd::pair&lt;unsigned long, unsigned long&gt;วัตถุ std::next_permutation()ฉันพยายามที่จะสร้างวัตถุพีชคณิตของเวกเตอร์โดยใช้ อย่างไรก็ตามฉันต้องการให้การเรียงสับเปลี่ยนมีขนาดตามที่คุณต้องการคล้ายกับpermutationsฟังก์ชันในไพ ธ อนซึ่งมีการระบุขนาดของการเปลี่ยนรูปแบบการส่งคืนที่คาดไว้ โดยทั่วไปc++เทียบเท่ากับ import itertools list = [1,2,3,4,5,6,7] for permutation in itertools.permutations(list, 3): print(permutation) Python Demo (1, 2, 3) (1, 2, 4) (1, 2, 5) (1, 2, 6) (1, 2, 7) (1, 3, 2) (1, 3, 4) .. (7, 5, 4) (7, 5, …

4
ตรวจสอบให้แน่ใจในเวลารวบรวมว่ามีการเรียกใช้เมธอดในที่เดียว
ฉันอยากรู้ว่าเป็นไปได้หรือไม่ที่จะมั่นใจได้ว่าในเวลารวบรวมว่ามีการเรียกใช้วิธีการในที่เดียว โปรดทราบว่ามันก็โอเคถ้าฟังก์ชั่นถูกเรียกมากกว่าหนึ่งครั้ง (เช่นในลูป) - แต่มันไม่ควรถูกเรียกในลูปสองวงแยกกัน สิ่งนี้สามารถแบ่งออกเป็นสองส่วนฉันยังสนใจในโซลูชันที่ครอบคลุมส่วนใดส่วนหนึ่ง: (a) ตรวจสอบให้แน่ใจว่ามีการเรียกวิธีการอย่างน้อยหนึ่งแห่ง (b) ตรวจสอบให้แน่ใจว่ามีการเรียกวิธีการในที่เดียว ฉันสามารถควบคุมโครงสร้างของโค้ดได้อย่างเต็มที่และสำนวนต่าง ๆ ที่ได้รับแนวคิดเดียวกันก็ยินดีต้อนรับ // class.h class MyClass { public: void my_method(); } ต่อไปนี้ไม่ควรรวบรวม (ไม่เคยเรียก) #include "class.h" int main() { MyClass my_class; } ข้อมูลต่อไปนี้ไม่ควรรวบรวม (เรียกมากกว่าหนึ่งแห่ง) #include "class.h" int main() { MyClass my_class; my_class.my_method(); while(true) { my_class.my_method(); } } ต่อไปนี้ควรรวบรวม (เรียกว่าในที่เดียว): #include …
15 c++ 

3
วิธีการรวบรวมเวลาเพื่อกำหนดประเภทอาร์กิวเมนต์ที่มีค่าใช้จ่ายน้อยที่สุด
ฉันมีแม่แบบที่มีลักษณะเช่นนี้ template &lt;typename T&gt; class Foo { public: Foo(const T&amp; t) : _t(t) {} private: const T _t; }; มีเทมเพลต metaprogramming เข้าใจวิธีที่จะหลีกเลี่ยงการใช้ const อ้างอิงในกรณีที่ประเภทอาร์กิวเมนต์เป็นเรื่องเล็กน้อยเช่นบูลหรือถ่าน? ชอบ: Foo(stl::smarter_argument&lt;T&gt;::type t) : _t(t) {}
15 c++  stl 

4
ขโมยทรัพยากรจาก std :: อนุญาตให้ใช้กุญแจของแผนที่ได้หรือไม่
ใน C ++ ตกลงเพื่อขโมยทรัพยากรจากแผนที่ที่ฉันไม่ต้องการอีกต่อไปหรือไม่? แม่นยำมากขึ้นถือว่าผมมีstd::mapกับstd::stringกุญแจและฉันต้องการที่จะสร้างเวกเตอร์ออกมาจากมันโดยการขโมยทรัพยากรของmapปุ่ม s std::moveใช้ โปรดทราบว่าการเข้าถึงเพื่อเขียนไปยังคีย์จะทำลายโครงสร้างข้อมูลภายใน (การเรียงลำดับคีย์) ของmapแต่ฉันจะไม่ใช้มันในภายหลัง คำถาม : ฉันสามารถทำสิ่งนี้ได้โดยไม่มีปัญหาหรือสิ่งนี้จะนำไปสู่ข้อผิดพลาดที่ไม่คาดคิดเช่นในตัวทำลายของmapเพราะฉันเข้าถึงมันในแบบที่std::mapไม่ได้ตั้งใจหรือไม่? นี่คือตัวอย่างโปรแกรม: #include&lt;map&gt; #include&lt;string&gt; #include&lt;vector&gt; #include&lt;iostream&gt; using namespace std; int main(int argc, char *argv[]) { std::vector&lt;std::pair&lt;std::string,double&gt;&gt; v; { // new scope to make clear that m is not needed // after the resources were stolen std::map&lt;std::string,double&gt; m; m["aLongString"]=1.0; …

5
นับจำนวนไฟล์ซอร์สโดยใช้มาโครหรือไม่
เป็นไปได้หรือไม่ที่จะใช้ตัวประมวลผลล่วงหน้า C / C ++ เพื่อนับบรรทัดภายในไฟล์ต้นฉบับไปเป็นมาโครหรือค่าคอมไพล์เวลาที่รวบรวมได้ เช่นฉันสามารถแทนที่MAGIC1, MAGIC2และMAGIC3ในต่อไปนี้และได้รับค่า 4 อย่างใดเมื่อใช้MAGIC3? MAGIC1 // can be placed wherever you like before the relevant // lines - either right before them, or in global scope etc. foo(); MAGIC2 bar(); MAGIC2 baz(); MAGIC2 quux(); MAGIC2 // ... possibly a bunch of code here; not …

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 …

2
ทำไม `std :: basic_ios` มีตัวสร้างสาธารณะ
std::basic_iosมีตัวสร้างสาธารณะ : explicit basic_ios (std::basic_streambuf&lt;CharT,Traits&gt;* sb); IMO เหตุผลเดียวที่คลาสมีตัวสร้างสาธารณะคือการใช้อินสแตนซ์แบบสแตนด์อโลนของคลาสนั้นในโปรแกรม ถ้าชั้นที่มีอยู่เท่านั้นที่จะมีชั้นเรียนอื่น ๆ สืบเชื้อสายมาจากมัน (ขณะที่ดูเหมือนว่าจะเป็นกรณีสำหรับbasic_ios) protectedทั้งหมดก่อสร้างระดับที่ควรจะเป็น สิ่งก่อสร้างของstd::ios_baseทั้งหมดได้รับการคุ้มครอง แต่ด้วยเหตุผลบางอย่างผู้ออกแบบมาตรฐานทำให้ผู้สร้างbasic_iosสาธารณะคนนี้ basic_iosจะถูกใช้เป็นชั้นฐานประเภทกระแสหลาย ๆ และฉันไม่สามารถมองเห็นกรณีการใช้งานที่คุณต้องการมีหนึ่งที่ไม่ได้เป็นอย่างน้อยหรือbasic_istream basic_ostreamมีไหม

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