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

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

2
ผ่านแนวคิดไปยังฟังก์ชั่น
เนื่องจากแนวคิดถูกกำหนดให้เป็นเพรดิเคตเวลาคอมไพล์จึงเป็นไปได้หรือไม่ที่จะใช้เพรดิเคตเหล่านี้ซ้ำสำหรับอัลกอริธึมเวลารวบรวม เช่นเป็นไปได้ไหมที่จะตรวจสอบว่าทุกประเภทใน tuple สอดคล้องกับแนวคิดหรือไม่? เท่าที่ฉันได้เห็นมันเป็นไปไม่ได้ที่จะส่งแนวคิดไปยังฟังก์ชั่นในทางใดทางหนึ่งซึ่งทำให้ฉันกลับไปใช้แม่แบบสำหรับกรณีเหล่านี้ #include <type_traits> template<typename T> concept FloatLike = std::is_same_v<T, float>; struct IsFloat { template<typename U> constexpr static bool test() { return FloatLike<U>; } }; template<typename Predicate, typename... T> constexpr bool all_types() { return (Predicate::template test<T>() && ...); } int main() { static_assert(all_types<IsFloat, float, float>()); static_assert(!all_types<IsFloat, float, …

5
ผลรวมที่มีเสถียรภาพของตัวเลขที่สั่งซื้อ
ฉันมีจำนวนบวกของตัวเลขบวกจำนวนจุดลอยตัว ( std::vector<float>ขนาด ~ 1,000) ตัวเลขจะเรียงตามลำดับที่ลดลง ถ้าฉันรวมพวกเขาตามคำสั่ง: for (auto v : vec) { sum += v; } ฉันเดาว่าฉันอาจมีปัญหาเสถียรภาพเชิงตัวเลขเนื่องจากใกล้ถึงจุดสิ้นสุดของเวกเตอร์sumจะยิ่งใหญ่กว่าvมาก วิธีแก้ปัญหาที่ง่ายที่สุดคือสำรวจเวกเตอร์ในลำดับย้อนกลับ คำถามของฉันคือ: มีประสิทธิภาพเช่นเดียวกับกรณีไปข้างหน้า? ฉันจะมีแคชหายไปอีกหรือไม่ มีโซลูชันอัจฉริยะอื่น ๆ อีกหรือไม่

2
การเริ่มต้นของเวกเตอร์อะตอมมิก
พิจารณา: void foo() { std::vector<std::atomic<int>> foo(10); ... } ตอนนี้เนื้อหาของ foo ใช้ได้หรือไม่ หรือฉันจำเป็นต้องวนซ้ำอย่างชัดเจนและเริ่มต้นได้อย่างไร ฉันได้ตรวจสอบ Godbolt แล้วและดูเหมือนดี แต่มาตรฐานดูเหมือนจะสับสนมากในจุดนี้ ตัวสร้าง:: เวกเตอร์ constructor บอกว่ามันแทรกอินสแตนซ์ที่แทรกค่าเริ่มต้นของstd::atomic<int>ซึ่งเป็นค่าเริ่มต้นผ่านตำแหน่งnewผ่านทางตำแหน่ง ฉันคิดว่าผลของการกำหนดค่าเริ่มต้นนี้ใช้: 2) ถ้า T เป็นประเภทคลาสที่มีคอนสตรัคเตอร์เริ่มต้นที่ไม่ได้จัดเตรียมโดยผู้ใช้หรือลบออก (นั่นคือมันอาจเป็นคลาสที่มีคอนสตรัคเตอร์ปริยายที่กำหนดหรือเป็นค่าปริยาย) วัตถุจะเป็นศูนย์เริ่มต้นแล้ว เริ่มต้นได้เริ่มต้นถ้ามันมีตัวสร้างเริ่มต้นที่ไม่สำคัญ; สำหรับฉันแล้วดูเหมือนว่าอะตอมมิกนั้นถูกกำหนดค่าเริ่มต้นเป็นศูนย์ ดังนั้นคำถามก็คือ a - initialisation ไม่เป็นศูนย์ของstd::atomic<int>ทำให้ผลลัพธ์เป็นวัตถุที่ถูกต้องเป็นศูนย์หรือไม่? ฉันจะเดาว่าคำตอบคือ "ใช่ในทางปฏิบัติ แต่ยังไม่ได้กำหนดจริงๆ"? หมายเหตุ: คำตอบนี้ยอมรับว่ามันเป็นค่าเริ่มต้นเป็นศูนย์ แต่ไม่ได้พูดจริง ๆ ถ้านั่นหมายความว่าวัตถุนั้นถูกต้อง
12 c++  vector  atomic 

2
เหตุใด destructor จึงถูกดำเนินการสองครั้ง
#include <iostream> using namespace std; class Car { public: ~Car() { cout << "Car is destructed." << endl; } }; class Taxi :public Car { public: ~Taxi() {cout << "Taxi is destructed." << endl; } }; void test(Car c) {} int main() { Taxi taxi; test(taxi); return 0; } นี่คือผลลัพธ์ …

1
ทำไมรหัสนี้ใช้เวลานานในการคอมไพล์ด้วย g ++
พิจารณารหัสต่อไปนี้: template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } เมื่อทำการเปรียบเทียบการคอมไพล์ด้วย g ++ โดยคำสั่ง Bash ต่อไปนี้ (ด้วย g ++ 8.3.0) for ((level=1; level<30; ++level)); do echo -n ${level}, /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp …

1
สามารถมีวัตถุโดยปริยายที่แตกต่างกันตามการตัดสินใจรันไทม์ในภายหลังใน C ++ 20 ได้หรือไม่
คำถามนี้หมายถึงการเพิ่มP0593ให้กับC ++ 20 ฉบับร่างล่าสุด นี่คือตัวอย่างของฉัน: #include <cstdlib> #include <cstdio> void foo(void *p) { if ( std::getchar() == 'i' ) { *(int *)p = 2; std::printf("%d\n", *(int *)p); } else { *(float *)p = 2; std::printf("%f\n", *(float *)p); } } int main() { void *a = std::malloc( sizeof(int) + sizeof(float) ); …

4
การเปลี่ยนแปลงที่เปลี่ยนแปลงใน C ++ 20 หรือการถดถอยใน clang-trunk / gcc-trunk เมื่อทำการโอเวอร์โหลดการเปรียบเทียบความเท่าเทียมกันกับค่าตอบแทนที่ไม่ใช่บูลีน?
รหัสต่อไปนี้รวบรวมดีกับ clang-trunk ในโหมด c ++ 17 แต่แบ่งในโหมด c ++ 2a (c ++ 20 ที่กำลังมาถึง): // Meta struct describing the result of a comparison struct Meta {}; struct Foo { Meta operator==(const Foo&) {return Meta{};} Meta operator!=(const Foo&) {return Meta{};} }; int main() { Meta res = (Foo{} != Foo{}); } …

3
ความแตกต่างระหว่าง std :: resize (n) และ std :: shrink_to_fit ใน C ++?
ฉันเจอข้อความเหล่านี้: resize(n)- ปรับขนาดภาชนะเพื่อให้มีองค์ประกอบ 'n' shrink_to_fit()- ลดความจุของภาชนะบรรจุให้พอดีกับขนาดและทำลายส่วนประกอบทั้งหมดเกินความจุ มีความแตกต่างที่สำคัญระหว่างฟังก์ชั่นเหล่านี้หรือไม่? พวกมันมาอยู่ใต้เวกเตอร์ใน c ++

1
`string.assign (string.data (), 5)` มีการกำหนดชัดเจนหรือ UB หรือไม่
เพื่อนร่วมงานต้องการเขียนสิ่งนี้: std::string_view strip_whitespace(std::string_view sv); std::string line = "hello "; line = strip_whitespace(line); ผมบอกว่ากลับมาstring_viewทำให้ฉันไม่สบายใจเบื้องต้นและนอกจาก aliasing ที่นี่ดูเหมือน UB ให้ฉัน ฉันสามารถพูดด้วยความมั่นใจว่าในกรณีนี้จะเทียบเท่ากับline = strip_whitespace(line) line = std::string_view(line.data(), 5)ฉันเชื่อว่าจะเรียกstring::operator=(const T&) [with T=string_view]ซึ่งถูกกำหนดให้เทียบเท่ากับline.assign(const T&) [with T=string_view]ซึ่งถูกกำหนดให้เทียบเท่ากับline.assign(line.data(), 5)ซึ่งถูกกำหนดให้ทำเช่นนี้: Preconditions: [s, s + n) is a valid range. Effects: Replaces the string controlled by *this with a copy …

1
วิธีการที่ทันสมัยในการทำให้ std :: vector จัดสรรหน่วยความจำที่จัดตำแหน่งไว้
คำถามต่อไปนี้เป็นเรื่องที่เกี่ยวข้อง แต่คำตอบที่มีความเก่าแก่และความคิดเห็นจากผู้ใช้มาร์ค Glisseแสดงให้เห็นมีวิธีการใหม่ตั้งแต่ C ++ 17 เพื่อแก้ไขปัญหานี้ที่อาจจะไม่ได้รับการกล่าวถึงอย่างเพียงพอ ฉันกำลังพยายามให้หน่วยความจำที่ทำงานสอดคล้องกันอย่างถูกต้องสำหรับ SIMD ในขณะที่ยังคงสามารถเข้าถึงข้อมูลทั้งหมดได้ ใน Intel ถ้าฉันสร้างเวกเตอร์ลอยชนิด__m256และลดขนาดลง 8 เท่ามันจะทำให้ฉันมีหน่วยความจำที่สอดคล้องกัน เช่น std::vector<__m256> mvec_a((N*M)/8); ในทางที่แฮ็กเล็กน้อยฉันสามารถชี้พอยน์เตอร์ไปยังองค์ประกอบเวกเตอร์เพื่อลอยตัวซึ่งทำให้ฉันสามารถเข้าถึงค่าลอยตัวส่วนบุคคล แต่ฉันต้องการให้มีการstd::vector<float>จัดตำแหน่งที่ถูกต้องและสามารถโหลดลงใน__m256และ SIMD ประเภทอื่น ๆ ได้โดยไม่ต้องแบ่งไฟล์ ฉันได้รับการมองเข้าไปในaligned_alloc นี่สามารถให้อาเรย์แบบ C ที่จัดเรียงอย่างถูกต้อง: auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); อย่างไรก็ตามฉันไม่แน่ใจว่าจะทำเช่นนี้std::vector<float>ได้อย่างไร ให้std::vector<float>เป็นเจ้าของไม่ได้ดูเหมือนจะเป็นไปได้marr_a ฉันเคยเห็นคำแนะนำบางอย่างที่ฉันควรเขียนตัวจัดสรรแบบกำหนดเองแต่ดูเหมือนว่าจะทำงานได้มากและบางทีด้วย C ++ ที่ทันสมัยมีวิธีที่ดีกว่า

1
การติดตั้งวงเล็บมุมของ GCC รวมถึง ทำไมต้องอธิบายตามด้านล่าง?
เอกสารนี้ในส่วนที่2.6 คำนวณรวมมีย่อหน้าต่อไปนี้: หากบรรทัดนั้นขยายไปยังสตรีมโทเค็นที่เริ่มต้นด้วย <โทเค็นและรวมถึงโทเค็น> โทเค็นที่อยู่ระหว่าง <และตัวแรก> จะรวมกันเพื่อสร้างชื่อไฟล์ที่จะรวม ช่องว่างใด ๆ ระหว่างโทเค็นจะถูกลดขนาดเป็นช่องว่างเดียว แล้วพื้นที่ใด ๆ หลังจากที่เริ่มต้น <จะถูกเก็บไว้ แต่พื้นที่ต่อท้ายก่อนปิด> ถูกละเว้น CPP ค้นหาไฟล์ตามกฎสำหรับการรวมวงเล็บมุม ฉันรู้ว่านี่เป็นการกำหนดการนำไปใช้ แต่ทำไมต้องเป็นเช่นนี้สำหรับ GCC ฉันหมายถึงเฉพาะประโยคที่เน้นสีด้านบน แก้ไข ฉันเพิ่งสังเกตเห็นว่าย่อหน้าที่สามก่อนที่จะยกมาข้างต้นกล่าวว่าต่อไปนี้: คุณต้องระวังเมื่อคุณกำหนดแมโคร #defineบันทึกโทเค็นไม่ใช่ข้อความ ตัวประมวลผลล่วงหน้าไม่มีทางรู้ได้ว่าแมโครจะถูกใช้เป็นอาร์กิวเมนต์#includeดังนั้นจึงสร้างโทเค็นสามัญไม่ใช่ชื่อส่วนหัว สิ่งนี้ไม่น่าจะทำให้เกิดปัญหาหากคุณใช้เครื่องหมายคำพูดคู่ซึ่งรวมถึงค่าคงที่ของสตริง ถ้าคุณใช้วงเล็บมุม แต่คุณอาจมีปัญหา ไม่มีใครรู้ว่าปัญหาแบบไหนที่ชี้ให้เห็นที่นี่?
11 c++  c  gcc  language-lawyer 

3
การคืนค่าตัวชี้โมฆะที่ไม่ซ้ำใครจากฟังก์ชั่น
ในการรับvoid *ฟังก์ชั่นใน CI จะทำสิ่งนี้ (ตัวอย่างพื้นฐานมาก): void *get_ptr(size_t size) { void *ptr = malloc(size); return ptr; } ฉันจะได้ผลลัพธ์เดียวกันเมื่อใช้งานได้std::unique_ptr<>อย่างไร
11 c++  c  unique-ptr 

1
ถูกต้องเพื่อเริ่มต้นอาร์เรย์ในตัวสร้าง constexpr หรือไม่
รหัสต่อไปนี้ถูกต้องตามกฎหมายหรือไม่ template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; เสียงดังกังวานยอมรับ แต่ GCC และ MSVC ปฏิเสธมัน ข้อผิดพลาดของ GCC คือ: main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = …

1
เหตุใดจึงต้องมี static_cast ในการใช้งาน gcc ของ is_nothrow_constructible
นำมาจากการใช้ GCC type_traitsว่าทำไมจึงstatic_castต้องมีที่นี่ template <typename _Tp, typename... _Args> struct __is_nt_constructible_impl : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {}; template <typename _Tp, typename _Arg> struct __is_nt_constructible_impl<_Tp, _Arg> : public integral_constant<bool, // Why is `static_cast` needed here? noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

1
อัลกอริทึมการตัดสตริงที่มีประสิทธิภาพโดยลบคำนำหน้าและคำต่อท้ายเท่ากันตามลำดับ
การ จำกัด เวลาต่อการทดสอบ: 5 วินาทีการ จำกัด หน่วยความจำต่อการทดสอบ: 512 เมกะไบต์ คุณได้รับสตริงที่มีsความยาวn( n≤ 5000) คุณสามารถเลือกคำนำหน้าใด ๆ ที่เหมาะสมของสายนี้ที่ยังต่อท้ายและลบคำนำหน้าเลือกหรือคำต่อท้ายที่สอดคล้องกัน จากนั้นคุณสามารถใช้การดำเนินการแบบอะนาล็อกกับสตริงผลลัพธ์และอื่น ๆ ความยาวต่ำสุดของสตริงสุดท้ายคืออะไรซึ่งสามารถทำได้หลังจากใช้ลำดับที่เหมาะสมของการดำเนินการดังกล่าว อินพุต บรรทัดแรกของการทดสอบแต่ละครั้งประกอบด้วยสตริงsที่ประกอบด้วยตัวอักษรภาษาอังกฤษตัวเล็ก ๆ เอาต์พุต เอาต์พุตจำนวนเต็มเดียว - ความยาวต่ำสุดของสตริงสุดท้ายที่สามารถทำได้หลังจากใช้ลำดับที่เหมาะสมของการดำเนินการดังกล่าว ตัวอย่าง +-------+--------+----------------------------------+ | Input | Output | Explanation | +-------+--------+----------------------------------+ | caaca | 2 | caaca → ca|aca → aca → ac|a → ac | …

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