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

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

2
เหตุใดการรวมกลุ่มของกลุ่มจึงช้ากว่ากลุ่มที่เรียงลำดับมากกว่ากลุ่มที่ไม่เรียงลำดับ
ฉันมีจำนวนคอลัมน์ที่คั่นด้วยแท็บ 2 คอลัมน์คอลัมน์แรกคือจำนวนเต็มแบบสุ่มคอลัมน์ที่สองคือจำนวนเต็มที่ระบุกลุ่มซึ่งโปรแกรมนี้สามารถสร้างขึ้นได้ ( generate_groups.cc) #include <cstdlib> #include <iostream> #include <ctime> int main(int argc, char* argv[]) { int num_values = atoi(argv[1]); int num_groups = atoi(argv[2]); int group_size = num_values / num_groups; int group = -1; std::srand(42); for (int i = 0; i < num_values; ++i) { if (i % group_size …
27 c++  performance 

3
ฉันจะป้องกันไม่ให้ C ++ คาดเดาอาร์กิวเมนต์เท็มเพลตที่สองได้อย่างไร
ฉันใช้ไลบรารี่ C ++ ( strf ) ซึ่งบางที่อยู่ภายในนั้นมีรหัสต่อไปนี้: namespace strf { template <typename ForwardIt> inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ } template <typename Range, typename CharT> inline auto range(const Range& range, const CharT* sep) { /* ... */ } } ตอนนี้ฉันต้องการใช้strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)ในรหัสของฉัน แต่ถ้าฉันทำฉันได้รับข้อผิดพลาดต่อไปนี้ (ด้วย …

3
ฉันจะสร้างวิธีที่ประเภทรายการคาร์ทีเซียนใน C ++ ได้อย่างไร
อธิบายตนเอง โดยพื้นฐานแล้วฉันมีรายการประเภทดังนี้: using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; พวกเขาสามารถเป็นจำนวนชนิดรายการ ฉันจะพิมพ์ดีดของผลิตภัณฑ์คาร์ทีเซียนได้อย่างไร result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; ฉันตะลุยวิธีการสร้างผลิตภัณฑ์คาร์ทีเซียนแบบสองทางตามที่กำหนดไว้ที่นี่: วิธีสร้างผลิตภัณฑ์คาร์ทีเซียนของรายการประเภท แต่ดูเหมือนไม่มีทางน่ารำคาญเลย ตอนนี้ฉันกำลังพยายาม ... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... …

3
มันโอเคที่จะส่งคืนค่าอาร์กิวเมนต์เริ่มต้นโดยการอ้างอิง const หรือไม่
มันโอเคที่จะส่งคืนค่าอาร์กิวเมนต์เริ่มต้นโดยการอ้างอิง const เช่นในตัวอย่างด้านล่าง: https://coliru.stacked-crooked.com/a/ff76e060a007723b #include <string> const std::string& foo(const std::string& s = std::string("")) { return s; } int main() { const std::string& s1 = foo(); std::string s2 = foo(); const std::string& s3 = foo("s"); std::string s4 = foo("s"); }

2
รายการ Initializer ภายใน std :: pair
รหัสนี้: #include <iostream> #include <string> std::pair<std::initializer_list<std::string>, int> groups{ { "A", "B" }, 0 }; int main() { for (const auto& i : groups.first) { std::cout << i << '\n'; } return 0; } คอมไพล์ แต่ส่งคืน segfault ทำไม? ทดสอบกับ gcc 8.3.0 และคอมไพเลอร์ออนไลน์
26 c++  std  std-pair 

4
เป็นโมฆะ * ฟังก์ชั่น () ตัวชี้ไปยังฟังก์ชั่นหรือฟังก์ชั่นกลับเป็นโมฆะ *?
void *function()ฉันสับสนเกี่ยวกับความหมายของ มันเป็นตัวชี้ไปยังฟังก์ชั่นหรือฟังก์ชั่นกลับมาvoid*? ฉันมักจะใช้มันในโครงสร้างข้อมูลเป็นฟังก์ชั่นซ้ำเรียกคืนตัวชี้ แต่เมื่อฉันเห็นรหัสใน multithreading ( pthread) มีการประกาศฟังก์ชั่นเดียวกัน ตอนนี้ฉันสับสนว่าอะไรคือความแตกต่างระหว่างพวกเขา


4
คอนเทนเนอร์ STL ที่มีประเภทเฉพาะเป็นอาร์กิวเมนต์ทั่วไป
มีวิธีที่ฉันสามารถสร้างฟังก์ชั่นที่ใช้ภาชนะที่มีประเภทเฉพาะ (ขอพูดstd::string) เป็นพารามิเตอร์ void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } และเรียกมันว่า stl container ทุกชนิดเป็น input หรือไม่? ชอบข้างบน? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);

2
วิธีตรวจสอบว่ามีการกำหนดจำนวนเต็มความกว้างคงที่หรือไม่
ใน C ++ จำนวนเต็มความกว้างคงที่ถูกกำหนดเป็นทางเลือกแต่ฉันไม่สามารถหาวิธีที่แนะนำในการตรวจสอบว่ามีการกำหนดจริงหรือไม่ อะไรเป็นวิธีแบบพกพาในการตรวจสอบว่ามีจำนวนเต็มความกว้างคงที่หรือไม่
25 c++  c++11  types  stdint  cstdint 

2
std :: unordered_map โอเปอเรเตอร์ [] ทำการ zero-initialization สำหรับคีย์ที่ไม่มีอยู่หรือไม่?
ตาม cppreference.com std::map::operator[]สำหรับค่าที่ไม่ได้มีอยู่จะเริ่มต้นเป็นศูนย์ อย่างไรก็ตามไซต์เดียวกันไม่ได้กล่าวถึงการกำหนดค่าเริ่มต้นเป็นศูนย์std::unordered_map::operator[]ยกเว้นจะมีตัวอย่างที่ต้องใช้สิ่งนี้ แน่นอนว่านี่เป็นเพียงเว็บไซต์อ้างอิงไม่ใช่มาตรฐาน ดังนั้นรหัสด้านล่างตกลงหรือไม่? #include <unordered_map> int main() { std::unordered_map<int, int> map; return map[42]; // is this guaranteed to return 0? }

2
initializers ที่กำหนดใน C ++ 20
ฉันมีคำถามเกี่ยวกับหนึ่งในคุณสมบัติ c ++ 20 ซึ่งเป็น initializers ที่กำหนด (ข้อมูลเพิ่มเติมเกี่ยวกับคุณลักษณะนี้ที่นี่ ) #include <iostream> constexpr unsigned DEFAULT_SALARY {10000}; struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{DEFAULT_SALARY}; }; int main() { std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed std::cout << std::boolalpha …

3
คอมไพเลอร์ได้รับอนุญาตให้ระเหยสารในท้องถิ่นได้หรือไม่?
พิจารณารหัสง่าย ๆ นี้: void g(); void foo() { volatile bool x = false; if (x) g(); } https://godbolt.org/z/I2kBY7 คุณจะเห็นว่าค่าgccมิได้เพิ่มประสิทธิภาพการโทรมีศักยภาพในการclang gสิ่งนี้ถูกต้องในความเข้าใจของฉัน: เครื่องนามธรรมคือการสันนิษฐานว่าvolatileตัวแปรอาจเปลี่ยนแปลงได้ตลอดเวลา (เนื่องจากเป็นเช่นการแมปฮาร์ดแวร์) ดังนั้นการfalseเริ่มต้นการพับการifตรวจสอบอย่างต่อเนื่องจะผิด แต่ MSVC กำจัดการเรียกไปที่gทั้งหมด (ทำให้การอ่านและเขียนไปยังvolatileแม้ว่า!) พฤติกรรมนี้เป็นไปตามมาตรฐานหรือไม่ พื้นหลัง: ฉันใช้โครงสร้างชนิดนี้เป็นครั้งคราวเพื่อให้สามารถเปิด / ปิดการดีบักเอาต์พุตแบบทันที: คอมไพเลอร์ต้องอ่านค่าจากหน่วยความจำเสมอดังนั้นการเปลี่ยนตัวแปร / หน่วยความจำในระหว่างการดีบักควรปรับเปลี่ยนการควบคุมตามลำดับ . เอาท์พุท MSVC จะอ่านค่าใหม่ แต่ไม่สนใจมัน (น่าจะเป็นเพราะการพับและ / หรือการกำจัดรหัสที่ตายแล้ว) ซึ่งแน่นอนว่าเอาชนะความตั้งใจของฉันที่นี่ การแก้ไข: การกำจัดของการอ่านและการเขียนvolatileถูกกล่าวถึงที่นี่: มันอนุญาตให้คอมไพเลอร์เพื่อปรับให้เหมาะสมกับตัวแปรที่ระเหยได้หรือไม่? (ขอบคุณนาธาน!) ฉันคิดว่ามาตรฐานมีความชัดเจนอย่างมากที่ผู้อ่านและเขียนจะต้องเกิดขึ้น แต่การสนทนานั้นไม่ครอบคลุมว่าจะเป็นการถูกกฎหมายหรือไม่ที่คอมไพเลอร์จะใช้ผลลัพธ์ของการอ่านเพื่อการอนุญาตและการปรับให้เหมาะสมตามนั้น …

2
ความหมายแบบอินไลน์ในโมดูลอินเตอร์เฟส
พิจารณาไฟล์ส่วนหัว: class T { private: int const ID; public: explicit T(int const ID_) noexcept : ID(ID_) {} int GetID() const noexcept { return ID; } }; หรืออีกทางหนึ่ง: class T { private: int const ID; public: explicit T(int const ID_) noexcept; int GetID() const noexcept; }; inline T::T(int const ID_) noexcept …

3
usecase คืออะไรสำหรับชัดแจ้ง (บูล)
C ++ 20 แนะนำชัดแจ้ง (บูล)ซึ่งเลือกตามเงื่อนไขในเวลาคอมไพล์ไม่ว่าคอนสตรัคเตอร์จะถูกสร้างขึ้นมาอย่างชัดเจนหรือไม่ ด้านล่างเป็นตัวอย่างที่ผมพบว่าที่นี่ struct foo { // Specify non-integral types (strings, floats, etc.) require explicit construction. template <typename T> explicit(!std::is_integral_v<T>) foo(T) {} }; foo a = 123; // OK foo b = "123"; // ERROR: explicit constructor is not a candidate (explicit specifier evaluates to true) foo …
24 c++  c++20  explicit 

1
ทำไม `เดคไทป์ (static_cast <T> (…))` ไม่เสมอ 'T'
สำหรับรหัสต่อไปนี้ทั้งหมด แต่การยืนยันครั้งสุดท้ายผ่านไป: template&lt;typename T&gt; constexpr void assert_static_cast_identity() { using T_cast = decltype(static_cast&lt;T&gt;(std::declval&lt;T&gt;())); static_assert(std::is_same_v&lt;T_cast, T&gt;); } int main() { assert_static_cast_identity&lt;int&gt;(); assert_static_cast_identity&lt;int&amp;&gt;(); assert_static_cast_identity&lt;int&amp;&amp;&gt;(); // assert_static_cast_identity&lt;int(int)&gt;(); // illegal cast assert_static_cast_identity&lt;int (&amp;)(int)&gt;(); assert_static_cast_identity&lt;int (&amp;&amp;)(int)&gt;(); // static assert fails } นี่คือเหตุผลที่ยืนยันที่ผ่านมาล้มเหลวและstatic_cast&lt;T&gt;ไม่เคยกลับT?
24 c++  static-cast 

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