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

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


6
เหตุใดฉันจึงไม่สามารถสร้างเวกเตอร์ของ lambdas (ชนิดเดียวกัน) ใน C ++ 11 ได้
ฉันพยายามสร้างเวกเตอร์แลมด้า แต่ล้มเหลว: auto ignore = [&]() { return 10; }; //1 std::vector<decltype(ignore)> v; //2 v.push_back([&]() { return 100; }); //3 ขึ้นกับสาย # 2 ก็รวบรวมดี แต่บรรทัด # 3 ให้ข้อผิดพลาดในการคอมไพล์ : ข้อผิดพลาด: ไม่มีฟังก์ชันที่ตรงกันสำหรับการเรียกไปที่ 'std :: vector <main () :: <lambda () >> :: push_back (main () :: <lambda ()>)' ฉันไม่ต้องการเวกเตอร์ของตัวชี้ฟังก์ชันหรือเวกเตอร์ของวัตถุฟังก์ชัน อย่างไรก็ตามเวกเตอร์ของวัตถุฟังก์ชันที่ห่อหุ้มนิพจน์แลมบ์ดาจริงจะใช้ได้สำหรับฉัน เป็นไปได้หรือไม่
90 c++  vector  lambda  c++11 

5
มี std :: shared_ptr ที่ไม่ใช่อะตอมหรือไม่ แล้วทำไมไม่มีใน <memory>?
นี่เป็นคำถามสองส่วนเกี่ยวกับปรมาณูของstd::shared_ptr: 1. เท่าที่ฉันสามารถบอกได้std::shared_ptrคือตัวชี้อัจฉริยะเพียงตัวเดียวใน&lt;memory&gt;อะตอมนั้น ฉันสงสัยว่ามีเวอร์ชันที่ไม่ใช่อะตอมหรือไม่std::shared_ptr(ฉันมองไม่เห็นอะไรเลย&lt;memory&gt;ดังนั้นฉันจึงเปิดรับข้อเสนอแนะที่อยู่นอกเหนือจากมาตรฐานเช่นใน Boost) ฉันรู้ว่าboost::shared_ptrเป็นปรมาณู (ถ้าBOOST_SP_DISABLE_THREADSไม่ได้กำหนดไว้) แต่อาจมีทางเลือกอื่น? ฉันกำลังมองหาสิ่งที่มีความหมายเหมือนstd::shared_ptrกัน แต่ไม่มีความเป็นอะตอม 2.ฉันเข้าใจว่าทำไมstd::shared_ptrอะตอม; มันก็ดีนะ อย่างไรก็ตามมันไม่ดีสำหรับทุกสถานการณ์และในอดีต C ++ มีมนต์ตราว่า "จ่ายเฉพาะสิ่งที่คุณใช้เท่านั้น" ถ้าฉันไม่ได้ใช้เธรดหลายเธรดหรือฉันกำลังใช้เธรดหลายเธรด แต่ฉันไม่ได้แชร์ความเป็นเจ้าของพอยน์เตอร์ข้ามเธรดตัวชี้สมาร์ทอะตอมจะมากเกินไป คำถามที่สองของฉันคือเหตุผลที่ไม่ได้เป็นรุ่นที่ไม่ใช่ของอะตอมstd::shared_ptrที่ระบุไว้ใน C ++ 11 ? (สมมติว่ามีสาเหตุ ) (หากคำตอบคือ "เวอร์ชันที่ไม่ใช่อะตอมก็ไม่เคยพิจารณา" หรือ "ไม่เคยมีใครขอเวอร์ชันที่ไม่ใช่อะตอม" ก็ไม่เป็นไร!) สำหรับคำถาม # 2 ฉันสงสัยว่ามีใครเคยเสนอรุ่นที่ไม่ใช่อะตอมของshared_ptr(ไม่ว่าจะเป็น Boost หรือคณะกรรมการมาตรฐาน) (ไม่ใช่เพื่อแทนที่รุ่นอะตอมshared_ptrแต่จะอยู่ร่วมกับมัน) และมันถูกยิงลงสำหรับ เหตุผลเฉพาะ

4
Import Library ทำงานอย่างไร รายละเอียด?
ฉันรู้ว่าสิ่งนี้อาจดูค่อนข้างธรรมดาสำหรับคนที่ชอบฟัง แต่ฉันต้องการทำให้มันใส เมื่อฉันต้องการใช้ Win32 DLL โดยปกติฉันจะเรียก API เช่น LoadLibrary () และ GetProcAdderss () แต่เมื่อเร็ว ๆ นี้ฉันกำลังพัฒนาด้วย DirectX9 และฉันต้องการเพิ่มไฟล์ d3d9.lib , d3dx9.libและอื่น ๆ ฉันได้ยินมามากพอแล้วว่า LIB ใช้สำหรับการลิงก์แบบคงที่และ DLL สำหรับการลิงก์แบบไดนามิก ดังนั้นความเข้าใจในปัจจุบันของฉันคือ LIB มีการใช้งานวิธีการและเชื่อมโยงแบบคงที่ในเวลาลิงก์เป็นส่วนหนึ่งของไฟล์ EXE สุดท้าย แม้ว่า DLL จะโหลดแบบไดนามิกที่รันไทม์และไม่ได้เป็นส่วนหนึ่งของไฟล์ EXE สุดท้าย แต่บางครั้งมีไฟล์ LIB บางไฟล์ที่มาพร้อมกับไฟล์ DLL ดังนั้น: ไฟล์ LIB เหล่านี้มีไว้ทำอะไร? พวกเขาบรรลุสิ่งที่ตั้งใจไว้ได้อย่างไร? มีเครื่องมือใดบ้างที่สามารถให้ฉันตรวจสอบภายในของไฟล์ LIB เหล่านี้ได้ อัปเดต …
90 c++  c  windows  visual-c++ 

5
C ++: Namespaces - วิธีใช้ในไฟล์ส่วนหัวและไฟล์ต้นฉบับอย่างถูกต้อง?
พิจารณาไฟล์ต้นฉบับสองไฟล์: ไฟล์ประกาศอินเตอร์เฟส ( *.hหรือ*.hpp) และไฟล์การนำไปใช้งาน ( *.cpp) ให้*.hไฟล์เป็นดังนี้: namespace MyNamespace { class MyClass { public: int foo(); }; } ฉันได้เห็นแนวทางปฏิบัติสองประการในการใช้เนมสเปซในไฟล์ต้นฉบับ: *.cpp แสดงการปฏิบัติ # 1: #include "MyClass.h" using namespace MyNamespace; int MyClass::foo() { ... } *.cpp แสดงการปฏิบัติ # 2: #include "MyClass.h" namespace MyNamespace { int MyClass::foo() { ... } } คำถามของฉัน:มีความแตกต่างระหว่างการปฏิบัติทั้งสองนี้และถือว่าดีกว่าอีกแบบหนึ่งหรือไม่?

12
วิธีตั้งค่า googleTest เป็นไลบรารีที่ใช้ร่วมกันบน Linux
Debian ไม่มีแพ็คเกจที่คอมไพล์ไว้ล่วงหน้าสำหรับ gTest อีกต่อไป พวกเขาแนะนำให้คุณรวมกรอบงานเข้ากับ makefile ของโครงการของคุณ แต่ฉันต้องการรักษา makefile ของฉันให้สะอาด ฉันจะตั้งค่า gTest เหมือนกับเวอร์ชันก่อนหน้า (&lt;1.6.0) ได้อย่างไรเพื่อให้สามารถเชื่อมโยงกับไลบรารี

6
เหตุผลใดที่จะไม่ใช้ lambdas ทั่วโลก?
เรามีฟังก์ชั่นที่ใช้แลมบ์ดาภายในที่จับภาพตัวเองไม่ได้เช่น: void foo() { auto bar = [](int a, int b){ return a + b; } // code using bar(x,y) a bunch of times } ตอนนี้ฟังก์ชั่นการใช้งานของแลมบ์ดากลายเป็นที่ต้องการในที่อื่นดังนั้นฉันจะยกแลมบ์ดาออกจากfoo()ขอบเขตโกลบอล / เนมสเปซ ฉันสามารถทิ้งไว้เป็นแลมบ์ดาทำให้เป็นตัวเลือกคัดลอกวางหรือเปลี่ยนเป็นฟังก์ชันที่เหมาะสม: auto bar = [](int a, int b){ return a + b; } // option 1 int bar(int a, int b){ return …
89 c++  lambda 

2
วัตถุประสงค์ของการใช้สหภาพกับสมาชิกเพียงคนเดียวคืออะไร?
เมื่อฉันอ่านซอร์สโค้ด seastarฉันสังเกตเห็นว่ามีโครงสร้างแบบสหภาพที่เรียกว่าtx_sideมีสมาชิกเพียงคนเดียว แฮ็คนี้จะจัดการกับปัญหาบางอย่างหรือไม่? FYI ฉันวางtx_sideโครงสร้างด้านล่าง: union tx_side { tx_side() {} ~tx_side() {} void init() { new (&amp;a) aa; } struct aa { std::deque&lt;work_item*&gt; pending_fifo; } a; } _tx;
89 c++  c++14  unions 


5
อะไรจะ 'std :;' ทำใน c ++?
ฉันเพิ่งแก้ไขโค้ดบางส่วนและพบข้อบกพร่องที่มีอยู่แล้วในบรรทัดเดียวภายในฟังก์ชัน: std:;string x = y; โค้ดนี้ยังคงคอมไพล์และทำงานตามที่คาดไว้ คำจำกัดความของสตริงทำงานได้เนื่องจากไฟล์นี้using namespace std;ดังนั้นจึงstd::ไม่จำเป็นในตอนแรก คำถามคือทำไมต้องstd:;รวบรวมและถ้ามีอะไรทำ?
89 c++  std  colon 

2
เหตุใดจึงต้องเปรียบเทียบอักขระ 'A' กับ 0x41
ฉันกำลังดูโค้ด C ++ และพบโครงสร้างต่อไปนี้: if('A' == 0x41) { // ... } else if('A' == 0xc1) { // ... } else { // ... } ฉันได้รับคำเตือนVisual Studioว่า: คำเตือน C4127 นิพจน์เงื่อนไขคงที่ Visual Studio นั้นถูกต้อง - แน่นอนว่า 'A' ถูกกำหนดให้เป็น 0x41 เหตุใดผู้เขียนจึงเขียนโค้ดนี้เนื่องจากสองในสามสาขาเป็นรหัสที่ตายแล้ว
89 c++  string 

4
เหตุใดจึงไม่มีการกำหนดค่าการย้าย / ย้ายตัวสร้างเริ่มต้น
ฉันเป็นโปรแกรมเมอร์ธรรมดา ๆ ตัวแปรสมาชิกชั้นเรียนของฉันส่วนใหญ่มักประกอบด้วยประเภท POD และ STL-container ด้วยเหตุนี้ฉันจึงแทบไม่ต้องเขียนตัวดำเนินการกำหนดหรือคัดลอกตัวสร้างเนื่องจากจะใช้งานโดยค่าเริ่มต้น เพิ่มสิ่งนี้ถ้าฉันใช้std::moveกับวัตถุที่ไม่สามารถเคลื่อนย้ายได้มันจะใช้ตัวดำเนินการกำหนดหมายความว่าstd::moveปลอดภัยอย่างสมบูรณ์ เนื่องจากฉันเป็นโปรแกรมเมอร์ธรรมดาฉันจึงต้องการใช้ประโยชน์จากความสามารถในการย้ายโดยไม่ต้องเพิ่มตัวสร้างการย้าย / ตัวดำเนินการกำหนดให้กับทุกชั้นเรียนที่ฉันเขียนเนื่องจากคอมไพเลอร์สามารถนำไปใช้เป็น " this-&gt;member1_ = std::move(other.member1_);..." แต่มันไม่มี (อย่างน้อยก็ไม่ใช่ใน Visual 2010) มีเหตุผลพิเศษสำหรับสิ่งนี้หรือไม่? ที่สำคัญกว่า; มีวิธีใดบ้างที่จะหลีกเลี่ยงสิ่งนี้? อัปเดต: หากคุณมองลงไปที่คำตอบของ GManNickG เขาให้มาโครที่ยอดเยี่ยมสำหรับสิ่งนี้ และหากคุณไม่ทราบหากคุณใช้การย้ายความหมายคุณสามารถลบฟังก์ชัน swap member ได้

3
นี่เป็นข้อผิดพลาดที่ทราบของ C ++ 11 สำหรับลูปหรือไม่?
สมมติว่าเรามีโครงสร้างสำหรับการถือครอง 3 คู่พร้อมฟังก์ชันสมาชิกบางอย่าง: struct Vector { double x, y, z; // ... Vector &amp;negate() { x = -x; y = -y; z = -z; return *this; } Vector &amp;normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // ... }; นี่เป็นเพียงเล็กน้อยที่ออกแบบมาเพื่อความเรียบง่าย …

12
จะประกาศอาร์เรย์ของสตริงใน C ++ ได้อย่างไร?
ฉันกำลังพยายามวนซ้ำองค์ประกอบทั้งหมดของสตริงอาร์เรย์แบบคงที่ด้วยวิธีที่ดีที่สุด ฉันต้องการที่จะสามารถประกาศมันในบรรทัดเดียวและเพิ่ม / ลบองค์ประกอบจากมันได้อย่างง่ายดายโดยไม่ต้องติดตามตัวเลข ฟังดูง่ายจริงๆใช่มั้ย? วิธีแก้ปัญหาที่เป็นไปได้: vector&lt;string&gt; v; v.push_back("abc"); b.push_back("xyz"); for(int i = 0; i &lt; v.size(); i++) cout &lt;&lt; v[i] &lt;&lt; endl; ปัญหา - ไม่มีวิธีสร้างเวกเตอร์ในบรรทัดเดียวด้วยรายการสตริง วิธีแก้ปัญหาที่เป็นไปได้ 2: string list[] = {"abc", "xyz"}; ปัญหา - ไม่มีวิธีรับจำนวนสตริงโดยอัตโนมัติ (ที่ฉันรู้จัก) ต้องมีวิธีง่ายๆในการทำเช่นนี้
89 c++  arrays 

7
ตอนนี้เรามี std :: array แล้วสิ่งที่ใช้สำหรับอาร์เรย์สไตล์ C คืออะไร?
std::arrayเหนือกว่าอาร์เรย์ C อย่างมาก และแม้ว่าฉันต้องการทำงานร่วมกับรหัสเดิมฉันก็สามารถstd::array::data()ใช้ได้ มีเหตุผลใดบ้างที่ฉันต้องการอาร์เรย์แบบเก่า?

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