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

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

4
ทำไมส่งคืน NULL จาก main ()
บางครั้งฉันเห็นโคเดอร์ที่ใช้NULLเป็นค่าส่งคืนของmain()ในโปรแกรม C และ C ++ ตัวอย่างเช่น: #include <stdio.h> int main() { printf("HelloWorld!"); return NULL; } เมื่อฉันรวบรวมรหัส `นี้กับ gcc ฉันได้รับคำเตือน: คำเตือน: return ทำให้จำนวนเต็มจากตัวชี้โดยไม่ต้องส่ง [-Wint-conversion] ซึ่งมีความสมเหตุสมผลเนื่องจากแมโครNULLจะถูกขยายไปและค่าตอบแทนของหลักจะเป็นประเภท(void*) 0int เมื่อฉันสร้างโปรแกรม C ++ สั้น ๆ ของ: #include <iostream> using namespace std; int main() { cout << "HelloWorld!"; return NULL; } และคอมไพล์ด้วย g ++ ฉันจะได้รับคำเตือนที่เทียบเท่า: คำเตือน: …
10 c++  c  null  return  return-value 

2
การหักอาร์กิวเมนต์เทมเพลตสำหรับอาร์กิวเมนต์ของประเภทฟังก์ชั่น
พิจารณาโปรแกรมต่อไปนี้ #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } โปรแกรมคอมไพล์ได้สำเร็จและผลลัพธ์คือ g( 42 ); ตอนนี้ขอเปลี่ยนชื่อฟังก์ชั่นที่ไม่ใช่แม่แบบเพื่อgf #include <iostream> …

1
เราจะสามารถสร้างคอนเทนเนอร์ด้วยมุมมองใน C ++ 20 ได้หรือไม่?
ช่วงกำลังมาถึง C ++ ด้วยเวอร์ชันมาตรฐาน C ++ 20 คำถามของฉัน: เราจะสามารถสร้างคอนเทนเนอร์ไลบรารีมาตรฐาน (ปัจจุบัน) กับช่วงใด ๆ ได้หรือไม่ และที่สำคัญยิ่งกว่าด้วยมุมมองระยะไกล? ตัวอย่างเช่นจะ: #include <vector> #include <iostream> #include <ranges> int main() { auto sq = [](int x) { return x * x; }; std::vector<int> vec { 3, 4, 5 }; std::vector<int> squares { std::ranges::views::transform(vec, sq) }; for(auto i …
10 c++  c++20  range-v3 

1
หน่วยความจำรั่วในระหว่าง unordered_map :: ใส่ข้อยกเว้น KeyEqual กับ GCC - ทำลายการรับประกันความปลอดภัยข้อยกเว้นที่รัดกุมหรือไม่
ฉันใช้ GCC 7.3.1 แต่ได้ทดสอบกับ coliru ด้วยซึ่งฉันเชื่อว่าเป็นรุ่น 9.2.0 สร้างด้วยสิ่งต่อไปนี้: g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp ที่นี่rai.cpp: #include <iostream> #include <unordered_map> int main() { try { struct MyComp { bool operator()(const std::string&, const std::string&) const { throw std::runtime_error("Nonono"); } }; std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare …

1
การกำหนดคอนเทนเนอร์โดยใช้ตัววนซ้ำของตนเองปลอดภัยหรือไม่?
ตัวอย่างเช่น: string s = "123"; s.assign(find(s.begin(),s.end(),'2'), s.end()); มีการกำหนดพฤติกรรมของรหัสข้างต้นหรือไม่ หรือมันนำไปสู่พฤติกรรมที่ไม่ได้กำหนด?
10 c++ 

1
^ () {} และ ^ {} หมายถึงอะไรใน C ++
ฉันเพิ่งอ่านรหัส C ++ บางอย่างเช่นนี้: setData(total, &user, ^() { struct dst_t to = {ip, port}; sendData(to, data); }); getData(total, ^{ recvData(data, NULL); }); ผมไม่เคยเห็นหรือ^() {} ^{}พวกเขาหมายถึงอะไร? ฟังก์ชั่นที่ไม่ระบุชื่อบางอย่าง?
10 c++ 

5
ทำไมฉันไม่สามารถดึงข้อมูลดัชนีของตัวแปรและใช้เพื่อรับเนื้อหาได้
ฉันพยายามเข้าถึงเนื้อหาของตัวแปร ฉันไม่รู้ว่ามีอะไรในนั้น แต่โชคดีที่ตัวแปรนี้ทำ ดังนั้นฉันคิดว่าฉันจะถามตัวแปรว่าดัชนีนั้นเปิดอยู่จากนั้นใช้ดัชนีนั้นกับstd::getเนื้อหา แต่นี่ไม่ได้รวบรวม: #include <variant> int main() { std::variant<int, float, char> var { 42.0F }; const std::size_t idx = var.index(); auto res = std::get<idx>(var); return 0; } ข้อผิดพลาดเกิดขึ้นในการstd::getโทร: error: no matching function for call to ‘get<idx>(std::variant<int, float, char>&)’ auto res = std::get<idx>(var); ^ In file included from /usr/include/c++/8/variant:37, …
10 c++  c++17  variant 

2
คุณต้องการสตริงที่สิ้นสุดด้วยค่า null ในสถานการณ์แบบอ่านอย่างเดียวเมื่อใด
ฉันได้เล่นกับstd::string_viewห้องสมุดและฉันได้ไตร่ตรองเกี่ยวกับการเปลี่ยนรหัสฐานที่ฉันได้พยายามใช้std::string_viewให้มากที่สุด อย่างไรก็ตามในหลายหัวข้อที่ผมได้อ่านในเรื่องของเวลาและสถานที่ที่จะใช้แทนstd::string_view const std::string &ฉันเห็นคำตอบมากมายว่า "เมื่อคุณไม่ต้องการสตริงที่สิ้นสุดด้วยค่า null" ดังนั้นเมื่อฉันเริ่มค้นหาเว็บ "คุณต้องการสตริงที่สิ้นสุดด้วยค่า null เมื่อใด" ฉันไม่ได้เจอคำตอบที่เป็นประโยชน์ในเรื่องนี้จริงๆ ฉันนึกถึงตัวอย่างของstd::stringไลบรารี่ภายนอกที่คุณจะต้องลิงค์ไปถึง และในกรณีนั้นคุณจะต้องใช้สตริงที่สิ้นสุดด้วยค่า null เนื่องจากไลบรารีนั้นต้องการ ฉันเดาอีกตัวอย่างหนึ่งคือหากคุณต้องการแก้ไขสตริงเอง แต่จากนั้นเราจะไม่ผ่านมันconst &หากเราต้องการแก้ไขมัน ดังนั้นเมื่อใดที่คุณจะต้องใช้สตริงที่สิ้นสุดด้วยค่า Null? ลิงค์ที่ฉันได้ดู: std :: string_view เร็วกว่า const std :: string & อย่างไร เมื่อใดที่ฉันจะส่งผ่าน const & std :: string แทนที่จะเป็น std :: string_view เหตุใดจึงต้องดูสตริง มีความหมายในการใช้ const std :: string & arguments …

1
เป็นไปได้หรือไม่ที่จะ จำกัด จำนวนเธรดสำหรับ C ++ 17 parallel `for_each`
ฉันใช้std::for_eachกับstd::execution::parเพื่อทำการคำนวณที่ซับซ้อนในการป้อนข้อมูลขนาดใหญ่ที่แสดงเป็นเวกเตอร์ของโครงสร้าง การคำนวณไม่ต้องการความล่าช้าใด ๆ ที่เกี่ยวข้องกับฮาร์ดแวร์ (เช่นเครือข่ายหรือดิสก์ IO) เป็นการคำนวณแบบ "just CPU" สำหรับฉันมันดูเหมือนว่าไม่มีเหตุผลที่จะสร้างเธรด OS เพิ่มเติมที่เรามีฮาร์ดแวร์ อย่างไรก็ตาม Visual C ++ 2019 จะสร้างเธรดโดยเฉลี่ย 50 เธรดและบางครั้งมากถึง 500 เธรดแม้ว่าจะมีเธรดฮาร์ดแวร์เพียง 12 เธรดเท่านั้น มีวิธี จำกัด เธรดแบบขนานที่นับhardware_concurrencyด้วยstd::for_eachและstd::execution::parหรือวิธีเดียวในการสร้างจำนวนเธรดที่สมเหตุสมผลคือการใช้โค้ดที่กำหนดเองด้วยstd::thread?

2
การหักประเภทอัตโนมัติไม่ตรงกันระหว่างคอมไพเลอร์ c ++ ที่ต่างกัน
ดังนั้นฉันกำลังพยายามที่จะใช้ผลิตภัณฑ์ dot ( https://en.wikipedia.org/wiki/Dot_product ) ในบางรสชาติของ C ++ ที่ทันสมัยและมาพร้อมกับรหัสต่อไปนี้: #include <iostream> template<class... Args> auto dot(Args... args) { auto a = [args...](Args...) { return [=](auto... brgs) { static_assert(sizeof...(args) == sizeof...(brgs)); auto v1 = {args...}, i1 = v1.begin(); auto v2 = {brgs...}, i2 = v2.begin(); typename std::common_type<Args...>::type s = 0; while( i1 …

2
VCRUNTIME140_1.dll หายไปหลังจากสร้างโซลูชันด้วย c ++
ฉันสร้างการผจญภัยข้อความเล็ก ๆ ฉันสร้างโซลูชันด้วย Visual Studio Community 2019 โดยใช้การตั้งค่า Release และ x64 ฉันได้บีบอัดไฟล์ * .exe พร้อมกับไฟล์ที่สร้างขึ้นอื่น ๆ และส่งไปยังพีซีเครื่องอื่นที่ไม่มี VS ติดตั้งและข้อผิดพลาดที่คุณเห็นในภาพนั้นเกิดขึ้น ฉันค้นหาพีซีของฉันและมีไฟล์อยู่ในโฟลเดอร์ต่าง ๆ สองอันหนึ่งในนั้นคือ system32 ดังนั้นฉันจึงไม่ทราบว่าจะวางไฟล์ไว้ที่ไหนในพีซีเครื่องใหม่ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม ขอบคุณ
10 c++  dll 

1
ต้องใช้นิพจน์ที่ได้รับอนุญาตในการ "จับ" ตัวแปรของขอบเขตการล้อมรอบหรือไม่
ในตัวอย่างต่อไปนี้อาร์กิวเมนต์ของฟังก์ชันถูกใช้เพื่อทดสอบด้วยนิพจน์ที่ต้องการว่านิพจน์ที่ใช้พวกเขานั้นมีรูปแบบที่ดีหรือไม่ การแสดงออกต้องไม่มีการโต้แย้ง; มันใช้ตัวแปรในขอบเขตฟังก์ชั่นโดยตรง: #include <cstddef> #include <vector> template<typename T> void Resize(T &v, std::size_t const n) { if constexpr (requires { v.resize(n); }) v.resize(n); } template<typename T> void Eziser(T &v, std::size_t const n) { if constexpr (requires { v.eziser(n); }) v.eziser(n); } int main() { std::vector<int> v; Resize(v, 10u); Eziser(v, 10u); …

2
คอมไพเลอร์ของฉันเพิกเฉยต่อสมาชิกคลาส thread_local ที่ไม่ได้ใช้ของฉันหรือไม่
ฉันต้องการลงทะเบียนกระทู้ในชั้นเรียนของฉันดังนั้นฉันตัดสินใจที่จะเพิ่มการตรวจสอบสำหรับthread_localคุณสมบัติ: #include <iostream> #include <thread> class Foo { public: Foo() { std::cout << "Foo()" << std::endl; } ~Foo() { std::cout << "~Foo()" << std::endl; } }; class Bar { public: Bar() { std::cout << "Bar()" << std::endl; //foo; } ~Bar() { std::cout << "~Bar()" << std::endl; } private: static thread_local …

2
วิธีการคัดลอกเมื่อผูกมัด?
ฉันกำลังสร้างคลาสของการผูกมัดประเภทเช่นตัวอย่างเล็ก ๆ ด้านล่าง ดูเหมือนว่าเมื่อการเชื่อมโยงสมาชิกฟังก์ชันแล้วตัวสร้างการคัดลอกจะถูกเรียกใช้ มีวิธีกำจัด call constructor ของการคัดลอกหรือไม่? ในตัวอย่างของเล่นของฉันด้านล่างเป็นที่ชัดเจนว่าฉันกำลังจัดการกับขมับเท่านั้นและดังนั้นจึงมี "ควร" (อาจไม่ได้ตามมาตรฐาน ตัวเลือกที่ดีที่สุดอันดับที่สองคือการคัดลอกตัวเลือกจะเป็นตัวสร้างการย้ายที่จะถูกเรียก แต่ไม่ใช่ในกรณีนี้ class test_class { private: int i = 5; public: test_class(int i) : i(i) {} test_class(const test_class& t) { i = t.i; std::cout << "Copy constructor"<< std::endl; } test_class(test_class&& t) { i = t.i; std::cout << "Move constructor"<< …
10 c++  c++14  c++17 

3
เหตุใดจึงไม่จำเป็นต้องใช้ชื่อพิมพ์สำหรับประเภทที่อ้างอิงในกรณีต่อไปนี้
ผมได้อ่านเกี่ยวกับการลบการอ้างอิงจากประเภทที่นี่ มันให้ตัวอย่างต่อไปนี้: #include <iostream> // std::cout #include <type_traits> // std::is_same template<class T1, class T2> void print_is_same() { std::cout << std::is_same<T1, T2>() << '\n'; } int main() { std::cout << std::boolalpha; print_is_same<int, int>(); print_is_same<int, int &>(); print_is_same<int, int &&>(); print_is_same<int, std::remove_reference<int>::type>(); // Why not typename std::remove_reference<int>::type ? print_is_same<int, std::remove_reference<int &>::type>();// Why …

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