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

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

5
จะมีตัวแปร const ใน for for loop สำหรับการสร้าง class template ได้อย่างไร?
ฉันมีรหัสเช่น template <size_t N> class A { template <size_t N> someFunctions() {}; }; ตอนนี้ฉันต้องการสร้างอินสแตนซ์ของคลาสและเรียกใช้ฟังก์ชันในการวนรอบสำหรับชุดของค่าจำนวนมากเช่น // in main() int main() { for (int i = 1; i <= 100; i++) { const int N = i; // dont know how to do this A<N> a; a.functionCalls(); } } ทำอย่างไร หวังว่าจะมีวิธีการทำเช่นนี้

2
เธรด C ++ ที่ใช้ฟังก์ชั่นวัตถุจะมีตัวเรียกว่า destructors หลายตัว แต่ไม่ใช่ตัวสร้าง
โปรดค้นหาข้อมูลโค้ดด้านล่าง: class tFunc{ int x; public: tFunc(){ cout<<"Constructed : "<<this<<endl; x = 1; } ~tFunc(){ cout<<"Destroyed : "<<this<<endl; } void operator()(){ x += 10; cout<<"Thread running at : "<<x<<endl; } int getX(){ return x; } }; int main() { tFunc t; thread t1(t); if(t1.joinable()) { cout<<"Thread is joining..."<<endl; t1.join(); } …

1
ความแตกต่างระหว่าง alloctaor :: construct ที่เก่ากว่าและตัวสร้างใหม่และตัวสร้างที่ชัดเจนคืออะไร
ฉันรู้ว่าstd::allocator<T>::constructใช้พารามิเตอร์เพียงสองตัวใน C ++ รุ่นเก่ากว่า; ตัวแรกคือตัวชี้ไปยังหน่วยความจำที่ไม่ได้สร้างขึ้นซึ่งเราต้องการสร้างวัตถุประเภทTและอันที่สองคือค่าของประเภทองค์ประกอบเพื่อเริ่มต้นวัตถุนั้น ดังนั้นตัวสร้างตัวสร้างจึงถูกเรียกใช้: struct Foo { Foo(int, int) { cout << "Foo(int, int)" << endl; } /*explicit*/ Foo(int) { cout << "Foo(int)" << endl; } Foo(const Foo&) { cout << "Foo(const Foo&)" << endl; } }; int main(int argc, char* argv[]) { allocator<Foo> a; Foo* const p …
15 c++  allocator 

3
ได้รับจำนวนเต็ม N. อะไรคือจำนวนเต็มเล็กที่สุดที่มากกว่า N ที่มีตัวเลขเป็น 0 หรือ 1 เท่านั้น
ฉันมีจำนวนเต็ม N. ฉันต้องไปหามากขึ้นเลขที่เล็กที่สุดกว่าไม่มีข้อความที่ไม่ประกอบด้วยหลักอื่น ๆ ที่ไม่ใช่ 0 หรือ 1 ตัวอย่างเช่นหากแล้วคำตอบคือN = 12 100ฉันเขียนรหัสวิธีบังคับเดรัจฉานใน C ++ int main() { long long n; cin >> n; for (long long i = n + 1; ; i++) { long long temp = i; bool ok = true; while (temp != 0) { if ( …
15 c++  algorithm 

2
เป็นโปรแกรมที่ไม่เคยยกเลิกโปรแกรม C ++ ที่ถูกต้องหรือไม่?
จำเป็นต้องมีโปรแกรมหรือไม่ ในคำอื่น ๆ เป็นโปรแกรมที่ทำงานตลอดเวลาพฤติกรรมที่ไม่ได้กำหนดทางเทคนิค? โปรดทราบว่านี่ไม่เกี่ยวกับลูปที่ว่างเปล่า การพูดเกี่ยวกับโปรแกรมที่ทำ "สิ่ง" (เช่นพฤติกรรมที่สังเกตได้) ตลอดไป เช่นบางสิ่งเช่นนี้ int main() { while (true) { try { get_input(); // calls IO process(); put_output(); // calls IO, has observable behavior // never break, exit, terminate, etc } catch(...) { // ignore all exceptions // don't (re)throw // never go out …

2
ทำไม std :: swap ที่ทำเครื่องหมายว่า constexpr ก่อน C ++ 20 ไม่
ใน C ++ 20 std::swapกลายเป็นconstexprฟังก์ชัน ฉันรู้ว่าห้องสมุดมาตรฐานล้าหลังภาษาในการทำเครื่องหมายสิ่งต่าง ๆconstexprแต่ในปี 2560 <algorithm>เป็นกลุ่มคนที่ค่อนข้างมากเหมือนกับสิ่งอื่น ๆ แต่ - std::swapไม่ใช่ ฉันจำได้ว่ามีข้อบกพร่องบางอย่างเกี่ยวกับภาษาแปลก ๆ ซึ่งป้องกันการทำเครื่องหมายนั้น แต่ฉันลืมรายละเอียด บางคนสามารถอธิบายสิ่งนี้อย่างกระชับและชัดเจน? แรงจูงใจ: จำเป็นต้องเข้าใจว่าเหตุใดจึงเป็นความคิดที่ไม่ดีที่จะทำเครื่องหมายstd::swap()ฟังก์ชันเหมือนconstexprในรหัส C ++ 11 / C ++ 14

3
การเรียกใช้ฟังก์ชันที่มีตัวชี้ไปยังไม่ใช่ const และตัวชี้ไปยังอาร์กิวเมนต์ const ของที่อยู่เดียวกัน
ฉันต้องการเขียนฟังก์ชั่นที่ป้อนอาร์เรย์ของข้อมูลและส่งออกอาเรย์อีกหนึ่งข้อมูลโดยใช้พอยน์เตอร์ ฉันสงสัยว่าผลลัพธ์คืออะไรถ้าทั้งคู่srcและdstชี้ไปยังที่อยู่เดียวกันเพราะฉันรู้ว่าคอมไพเลอร์สามารถปรับให้เหมาะสมสำหรับ const มันเป็นพฤติกรรมที่ไม่ได้กำหนดหรือไม่? (ฉันติดแท็กทั้ง C และ C ++ เพราะฉันไม่แน่ใจว่าคำตอบอาจแตกต่างกันหรือไม่และฉันต้องการทราบเกี่ยวกับทั้งคู่) void f(const char *src, char *dst) { dst[2] = src[0]; dst[1] = src[1]; dst[0] = src[2]; } int main() { char s[] = "123"; f(s,s); printf("%s\n", s); return 0; } นอกเหนือจากคำถามข้างต้นแล้วสิ่งนี้ได้กำหนดไว้อย่างชัดเจนหรือไม่หากฉันลบconstในรหัสต้นฉบับ?

2
std :: chrono :: ปีการจัดเก็บอย่างน้อย 17 บิตจริงหรือ
จากcppreference std::chrono::years (since C++20) duration</*signed integer type of at least 17 bits*/, std::ratio<31556952>> ใช้libc++ดูเหมือนว่าการจัดเก็บการขีดเส้นใต้std::chrono::yearsมีที่shortซึ่งมีการลงนาม16 บิต std::chrono::years( 30797 ) // yields 32767/01/01 std::chrono::years( 30797 ) + 365d // yields -32768/01/01 apparently UB มีการพิมพ์ผิดในcppreferenceหรืออะไรอย่างอื่น? ตัวอย่าง: #include <fmt/format.h> #include <chrono> template <> struct fmt::formatter<std::chrono::year_month_day> { char presentation = 'F'; constexpr auto parse(format_parse_context& ctx) …
14 c++  chrono  c++20  libc++ 

3
การเรียงลำดับเวกเตอร์ตามลำดับจากมากไปน้อยภายในสองช่วง
ว่าฉันมีเวกเตอร์จำนวนเต็ม: std::vector<int> indices; for (int i=0; i<15; i++) indices.push_back(i); จากนั้นฉันเรียงตามลำดับจากมากไปน้อย: sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];}) for (int i=0; i<15; i++) printf("%i\n", indices[i]); สิ่งนี้สร้างสิ่งต่อไปนี้: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ตอนนี้ฉันต้องการให้หมายเลข 3, 4, 5 และ 6 …

1
เสียงดังกราวไม่ได้รวบรวมรหัส แต่ gcc และ msvc รวบรวมไว้
ฉันไม่เข้าใจว่ามีปัญหาอะไร: ในโค้ดของฉันหรือในคอมไพเลอร์ (น้อยกว่านั้นเป็นไปได้) มีชิ้นส่วนของรหัสเช่นนี้: #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {}; template<typename T> struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {}; int main() { std::cout << TestA<std::set<int>>::value; } ทั้ง GCC และ MSVC รวบรวมมัน ผมทดสอบบน …

2
เวกเตอร์เป็นคีย์ทำงานอย่างไรภายใน C ++
คำตอบ SO นี้บอกว่าแผนที่ STL พร้อม Vector สำหรับคีย์นั้นเวกเตอร์สามารถใช้เป็นคีย์ได้ ดังนั้นเมื่อเราใช้เวกเตอร์เป็นกุญแจ ใช้งานได้จริงอย่างไรเนื่องจากคีย์ต้องไม่ซ้ำกันดังนั้นเมื่อเราแทรกเวกเตอร์อื่นที่มีองค์ประกอบเดียวกันจะmapตรวจสอบองค์ประกอบที่ซ้ำกันตามองค์ประกอบหรือชื่อของเวกเตอร์ระบุบางอย่าง เช่นเดียวกับชื่อของอาร์เรย์หมายถึงที่อยู่ฐาน ดังนั้นอาเรย์สามารถใช้เป็นคีย์ได้เนื่องจากที่อยู่พื้นฐานสามารถใช้เป็นคีย์ในกรณีนี้ แต่คีย์ในกรณีของเวกเตอร์คืออะไร มันทำงานอย่างไรภายใน เพราะเมื่อฉันพิมพ์ชื่อของเวกเตอร์ฉันจะได้รับข้อผิดพลาด vector<int> v; cout<<v; //error
14 c++  arrays  dictionary  vector  stl 

1
ทำไม GCC ไม่สามารถสันนิษฐานได้ว่า std :: vector :: size จะไม่เปลี่ยนแปลงในลูปนี้
ฉันอ้างว่าเป็นเพื่อนร่วมงานที่if (i < input.size() - 1) print(0);จะได้รับการเพิ่มประสิทธิภาพในวงนี้เพื่อที่input.size()จะไม่ได้อ่านทุกครั้ง แต่มันกลับกลายเป็นว่านี่ไม่ใช่กรณี! void print(int x) { std::cout << x << std::endl; } void print_list(const std::vector<int>& input) { int i = 0; for (size_t i = 0; i < input.size(); i++) { print(input[i]); if (i < input.size() - 1) print(0); } } ตามCompiler Explorerพร้อมตัวเลือก gcc …
14 c++  gcc  assembly 

1
ฉันสามารถ list-initialize std :: vector พร้อมการส่งต่อองค์ประกอบที่สมบูรณ์ได้หรือไม่?
ฉันสังเกตเห็นว่ารายการรวม initalization ของ std :: vector ดำเนินการเริ่มต้นการคัดลอกเมื่อย้ายจะใช้งานได้มากขึ้น ในเวลาเดียวกันหลาย emplace_backs ทำสิ่งที่ฉันต้องการ init_emplace_vectorฉันเท่านั้นที่สามารถเกิดขึ้นกับวิธีการแก้ปัญหาที่ไม่สมบูรณ์ของการเขียนฟังก์ชั่นแม่แบบ มันเป็นสิ่งที่ดีที่สุดสำหรับตัวสร้างค่าเดียวที่ไม่ชัดเจน template <typename T, typename... Args> std::vector<T> init_emplace_vector(Args&&... args) { std::vector<T> vec; vec.reserve(sizeof...(Args)); // by suggestion from user: eerorika (vec.emplace_back(std::forward<Args>(args)), ...); // C++17 return vec; } คำถาม ฉันจำเป็นต้องใช้ emplace_backเพื่อเริ่มต้น std :: vector ให้มีประสิทธิภาพมากที่สุดหรือไม่ // an integer passed to large …

1
ทำไมการปรับฐานว่างเปล่าจึงถูกห้ามเมื่อคลาสฐานที่ว่างเปล่าเป็นตัวแปรสมาชิกด้วย?
การเพิ่มประสิทธิภาพฐานที่ว่างเปล่าดีมาก อย่างไรก็ตามมันมาพร้อมกับข้อ จำกัด ดังต่อไปนี้: การเพิ่มประสิทธิภาพฐานว่างเปล่าเป็นสิ่งต้องห้ามหากหนึ่งในคลาสฐานที่ว่างเปล่าเป็นชนิดหรือฐานของประเภทของข้อมูลสมาชิกไม่คงที่ครั้งแรกเนื่องจาก subobjects ฐานสองประเภทเดียวกันจะต้องมีที่อยู่ที่แตกต่างกันภายในการแสดงวัตถุ ประเภทที่ได้รับมากที่สุด เพื่ออธิบายข้อ จำกัด นี้ให้พิจารณารหัสต่อไปนี้ static_assertจะล้มเหลว ในขณะที่การเปลี่ยนแปลงอย่างใดอย่างหนึ่งFooหรือBarเพื่อสืบทอดจากBase2จะเป็นการหลีกเลี่ยงข้อผิดพลาด: #include <cstddef> struct Base {}; struct Base2 {}; struct Foo : Base {}; struct Bar : Base { Foo foo; }; static_assert(offsetof(Bar,foo)==0,"Error!"); ฉันเข้าใจพฤติกรรมนี้อย่างสมบูรณ์ สิ่งที่ฉันไม่เข้าใจคือสาเหตุพฤติกรรมนี้โดยเฉพาะอย่างยิ่งที่มีอยู่ เห็นได้ชัดว่ามีการเพิ่มเข้ามาด้วยเหตุผลเนื่องจากเป็นการเพิ่มที่ชัดเจนไม่ใช่การกำกับดูแล เหตุผลนี้คืออะไร โดยเฉพาะอย่างยิ่งทำไม subobjects ทั้งสองควรจะต้องมีที่อยู่ที่แตกต่างกัน? ในข้างต้นBarเป็นประเภทและfooเป็นตัวแปรสมาชิกประเภทนั้น ฉันไม่เห็นว่าทำไมชั้นฐานของBarเรื่องถึงชั้นฐานของประเภทfooหรือในทางกลับกัน อันที่จริงฉันมีอะไรถ้าฉันคาดหวังว่า&fooจะเป็นเช่นเดียวกับที่อยู่ของBarอินสแตนซ์ที่มีมัน - มันจะต้องอยู่ในสถานการณ์อื่น(1) (1)หลังจากทั้งหมดฉันไม่ได้ทำอะไรแฟนซีกับการvirtualสืบทอดคลาสพื้นฐานว่างเปล่าโดยไม่คำนึงถึงและการคอมไพล์ด้วยBase2แสดงว่าไม่มีอะไรแตกในกรณีนี้โดยเฉพาะ แต่ชัดเจนว่าเหตุผลนี้ไม่ถูกต้องอย่างใดอย่างหนึ่งและมีสถานการณ์อื่น ๆ …

1
เหตุใดจึงมีการจัดสรรหน่วยความจำสแต็คเมื่อไม่ใช้
ลองพิจารณาตัวอย่างต่อไปนี้: struct vector { int size() const; bool empty() const; }; bool vector::empty() const { return size() == 0; } รหัสการประกอบที่สร้างขึ้นสำหรับvector::empty(โดยเสียงดังกราวด้วยการเพิ่มประสิทธิภาพ): push rax call vector::size() const test eax, eax sete al pop rcx ret ทำไมมันจัดสรรพื้นที่สแต็ค? มันไม่ได้ใช้เลย pushและpopอาจถูกมองข้าม บิลด์ที่ปรับให้เหมาะสมของ MSVC และ gcc ยังใช้พื้นที่สแต็กสำหรับฟังก์ชั่นนี้ (ดูที่godbolt ) ดังนั้นต้องมีเหตุผล

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