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

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

5
ตั้งค่าการทำงานใน c ++ (อัปเดตค่าที่มีอยู่)
นี่คือรหัสของฉัน: while (it!=s.end()) //here 's' is a set of stl and 'it' is iterator of set { *it=*it-sub; //'sub' is an int value it++; } ฉันไม่สามารถอัปเดตค่าที่กำหนดโดยตัววนซ้ำ ฉันต้องการลบค่าจำนวนเต็ม 'ย่อย' จากองค์ประกอบทั้งหมดของชุด ใครช่วยฉันได้บ้างว่าปัญหาที่แท้จริงคืออะไรและอะไรจะเป็นทางออกที่แท้จริง? นี่คือข้อความแสดงข้อผิดพลาด: error: assignment of read-only location ‘it.std::_Rb_tree_const_iterator<int>::operator*()’ 28 | *it=*it-sub; | ~~~^~~~~~~~
21 c++ 

3
แบ่ง std :: variant type ที่กำหนดตามเกณฑ์ที่กำหนด
วิธีการตามประเภทของตัวแปรที่กำหนด using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>; ประกาศสองประเภทที่แตกต่าง using V1 = std::variant<bool, char, int, float, double>; using V2 = std::variant<std::string, std::vector<int>>; ซึ่งV1รวมถึงประเภทคณิตศาสตร์ทั้งหมดจากVและV2รวมประเภทที่ไม่ใช่คณิตศาสตร์ทั้งหมดมาจากVไหน V สามารถเป็นพารามิเตอร์ของคลาสแม่แบบตัวอย่างเช่น: template <class V> struct TheAnswer { using V1 = ?; using V2 = ?; }; โดยทั่วไปเกณฑ์สามารถเป็นconstexprตัวแปรเช่นนี้: template <class T> constexpr bool filter;
20 c++  c++17  std-variant 

1
การวางไข่เธรดให้การรับประกันคำสั่งหน่วยความจำด้วยตัวเองหรือไม่?
ฉันต้องการทำอย่างนี้: กระทู้เริ่มต้น: เขียนค่าบางอย่างไปยัง vars ส่วนกลาง (จะไม่ถูกเขียนอีกครั้ง) นี่อาจเป็นข้อมูลขนาดใหญ่พอสมควร (อาร์เรย์สตริง ฯลฯ ) สามารถไม่เพียง std::atomic<>แต่จะทำ วางไข่หัวข้ออื่น ๆ หัวข้ออื่น ๆ : อ่านสถานะโลก ทำงาน ฯลฯ ตอนนี้ฉันรู้ว่าฉันสามารถส่งผ่านข้อโต้แย้งไปstd::threadได้ แต่ฉันพยายามเข้าใจการรับประกันหน่วยความจำของ C ++ ผ่านตัวอย่างนี้ นอกจากนี้ฉันค่อนข้างมั่นใจว่าในการใช้งานจริงใด ๆ การสร้างเธรดจะทำให้สิ่งกีดขวางหน่วยความจำทำให้มั่นใจว่าเธรดสามารถ "เห็น" ทุกสิ่งที่เธรดเธรดเขียนขึ้นจนถึงจุดนั้น แต่คำถามของฉันคือ: สิ่งนี้รับประกันโดยมาตรฐานหรือไม่ นอกเหนือ: ฉันคิดว่าฉันสามารถเพิ่มหุ่นบางตัวstd::atomic<int>หรือมากกว่านั้นและเขียนลงในนั้นก่อนที่จะเริ่มหัวข้ออื่น ๆ จากนั้นในหัวข้ออื่น ๆ อ่านครั้งเดียวเมื่อเริ่มต้น ฉันเชื่อว่าสิ่งที่เกิดขึ้นก่อนที่เครื่องจักรจะรับประกันได้ว่ารัฐทั่วโลกที่เขียนไว้ก่อนหน้านี้จะมองเห็นได้อย่างถูกต้อง แต่คำถามของฉันคือถ้าสิ่งที่ต้องการในเชิงเทคนิคหรือการสร้างเธรดเพียงพอหรือไม่

1
ทำไม {} เนื่องจากอาร์กิวเมนต์ของฟังก์ชันไม่นำไปสู่ความกำกวม?
พิจารณารหัสนี้: #include <vector> #include <iostream> enum class A { X, Y }; struct Test { Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X) { std::cout << "vector overload" << std::endl; } Test(const std::vector<double>&, int, A = A::X) { std::cout << "int overload" << std::endl; } }; int main() { …

1
ประเภทเทมเพลตและความกำกวมกลับอัตโนมัติ
ฉันมีฟังก์ชั่นเทมเพลตมากเกินไป: template<typename T1, typename T2> auto overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; } template<typename RT, typename T1, typename T2> RT overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; …

4
ใช้กับ std :: transform กับ std :: back_inserter ได้ไหม
Cppreference มีโค้ดตัวอย่างนี้สำหรับstd::transform: std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); แต่มันก็พูดว่า: std::transformไม่ได้รับประกันการประยุกต์ใช้ในการสั่งซื้อของหรือunary_op เมื่อต้องการใช้ฟังก์ชั่นลำดับในการสั่งซื้อหรือจะใช้ฟังก์ชั่นที่ปรับเปลี่ยนองค์ประกอบของลำดับการใช้งานbinary_opstd::for_each นี่น่าจะอนุญาตให้มีการใช้งานแบบขนาน อย่างไรก็ตามพารามิเตอร์ที่สามของstd::transformคือLegacyOutputIteratorซึ่งมี postcondition ต่อไปนี้สำหรับ++r: หลังจากการดำเนินการrนี้ไม่จำเป็นต้องเพิ่มและสำเนาใด ๆ ของค่าก่อนหน้าของrไม่จำเป็นต้องถูกยกเลิกหรือเพิ่มเติม สำหรับฉันแล้วดูเหมือนว่าการกำหนดผลลัพธ์จะต้องเกิดขึ้นตามลำดับ พวกเขาหมายถึงว่าแอปพลิเคชันunary_opอาจไม่เป็นระเบียบและจัดเก็บในตำแหน่งชั่วคราว แต่คัดลอกไปยังเอาต์พุตตามลำดับหรือไม่ ไม่ได้ดูเหมือนสิ่งที่คุณอยากจะทำ ไลบรารี C ++ ส่วนใหญ่ยังไม่ได้ใช้ตัวจัดการแบบขนานจริง ๆ แต่ Microsoft มี ผมค่อนข้างมั่นใจว่านี้เป็นรหัสที่เกี่ยวข้องและผมคิดว่ามันสายนี้populate()ฟังก์ชั่นการบันทึกเพื่อ iterators ชิ้นของการส่งออกซึ่งก็ไม่ได้เป็นสิ่งที่ถูกต้องที่จะทำเพราะ LegacyOutputIteratorสามารถจะถูกยกเลิกโดยการเพิ่มสำเนาของมัน ฉันกำลังคิดถึงอะไร

2
จะปลอดภัยไหมที่จะเรียกตำแหน่งใหม่บน "นี่" สำหรับวัตถุที่ไม่สำคัญ?
ฉันรู้ว่าคำถามนี้ถูกถามหลายครั้งแล้ว แต่ฉันไม่สามารถหาคำตอบสำหรับกรณีนี้โดยเฉพาะ สมมติว่าฉันมีชั้นเรียนที่ไม่สำคัญซึ่งไม่ได้เป็นเจ้าของทรัพยากรใด ๆ และมีตัวทำลายที่ว่างเปล่าและตัวสร้างเริ่มต้น มันมีตัวแปรสมาชิกจำนวนหนึ่งที่มีการเริ่มต้นในคลาส constไม่ได้เป็นหนึ่งในนั้นคือ ฉันต้องการเริ่มต้นใหม่และวัตถุของชั้นเรียนดังกล่าวโดยไม่ต้องเขียนdeInitวิธีด้วยมือ ปลอดภัยไหมที่จะทำอย่างนี้? void A::deInit() { new (this)A{}; } ฉันไม่เห็นปัญหาใด ๆ กับวัตถุ - วัตถุอยู่ในสถานะที่ถูกต้องเสมอthisชี้ไปยังที่อยู่เดียวกัน แต่มันคือ C ++ ดังนั้นฉันต้องการแน่ใจ

3
พฤติกรรมที่ไม่ได้กำหนดในเวกเตอร์ของเวกเตอร์ที่ส่ง
ทำไมรหัสนี้จึงเขียนจำนวนเต็มที่ไม่ได้กำหนดจำนวนที่ดูเหมือนไม่ได้กำหนดไว้? #include <iostream> #include <vector> using namespace std; int main() { for (int i : vector<vector<int>>{{77, 777, 7777}}[0]) cout << i << ' '; } 77 777 7777ผมคาดว่าการส่งออกจะเป็น รหัสนี้ควรถูกยกเลิกหรือไม่?
19 c++ 

2
ตัวเลข int -> กฎการแปลงตัวชี้
พิจารณารหัสต่อไปนี้ void f(double p) {} void f(double* p) {} int main() { f(1-1); return 0; } MSVC 2017 ไม่ได้รวบรวมสิ่งนั้น มันตัวเลขมีสายเรียกเกินไปคลุมเครือเป็น1-1เป็นเช่นเดียวกับและดังนั้นจึงสามารถแปลงเป็น0 double*เทคนิคอื่น ๆ เช่น0x0, 0Lหรือstatic_cast<int>(0)ไม่ทำงานอย่างใดอย่างหนึ่ง แม้แต่การประกาศ a const int Zero = 0และการเรียกก็f(Zero)ทำให้เกิดข้อผิดพลาดเดียวกัน มันทำงานได้เพียงอย่างถูกต้องหากไม่ได้เป็นZeroconst ดูเหมือนว่าปัญหาเดียวกันจะใช้กับ GCC 5 และด้านล่าง แต่ไม่ใช่ GCC 6 ฉันอยากรู้ว่านี่เป็นส่วนหนึ่งของมาตรฐาน C ++, ข้อผิดพลาด MSVC ที่รู้จักหรือการตั้งค่าในคอมไพเลอร์ Google คร่าวๆไม่ได้ผลลัพธ์
19 c++  visual-c++  types 

3
c ++ เธรดภายในเพื่อวนซ้ำค่าที่ไม่ถูกต้อง
ฉันพยายามที่จะเข้าใจ Multi-Threading ใน c ++ แต่ฉันติดอยู่กับปัญหานี้: ถ้าฉันเริ่มใช้เธรดในลูปพวกเขาพิมพ์ค่าผิด นี่คือรหัส: #include <iostream> #include <list> #include <thread> void print_id(int id){ printf("Hello from thread %d\n", id); } int main() { int n=5; std::list<std::thread> threads={}; for(int i=0; i<n; i++ ){ threads.emplace_back(std::thread([&](){ print_id(i); })); } for(auto& t: threads){ t.join(); } return 0; } ฉันคาดหวังว่าจะได้รับการพิมพ์ค่า 0,1,2,3,4 แต่ฉันมักจะได้รับค่าเดียวกันสองครั้ง …

3
ค่าของตัวชี้ `นี่ 'คงที่ในช่วงชีวิตของวัตถุหรือไม่?
ค่าของthisตัวชี้รับประกันเป็นค่าคงที่ในช่วงชีวิตของวัตถุเฉพาะหรือไม่? ฉันไม่สามารถจินตนาการถึงกรณีที่มันจะเปลี่ยน แต่ไม่ทราบว่าฉันไม่ได้หายไปบางสิ่งบางอย่าง

1
เหตุใด std :: atomic constructor จึงมีความแตกต่างใน C ++ 14 และ C ++ 17
ฉันทำงานในโครงการที่มี C ++ 11 และฉันลองใช้รหัสต่อไปนี้ #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } ฉันได้รับข้อผิดพลาดของคอมไพเลอร์ error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ ผลลัพธ์เดียวกันคือกับ C ++ 14 เมื่อฉันเปลี่ยนเป็น C ++ 17 มันใช้งานได้: wandbox ฉันตรวจสอบความแตกต่างของ cppreference: …
19 c++  c++14  c++17  stdatomic 

1
ใช้ C ++ 20 chrono วิธีคำนวณข้อเท็จจริงต่าง ๆ เกี่ยวกับวันที่
https://www.timeanddate.com/date/weekday.htmlคำนวณข้อเท็จจริงต่าง ๆ เกี่ยวกับวันของปีตัวอย่างเช่น: ให้วันที่โดยพลการตัวเลขเหล่านี้สามารถคำนวณได้ด้วยข้อกำหนดC ++ 20 chronoอย่างไร
19 c++  chrono  c++20 

2
เหตุใดการตรวจสอบแนวคิด Same_as จึงพิมพ์ความเท่าเทียมกันสองครั้ง
ดูที่การนำไปปฏิบัติที่เป็นไปได้ของแนวคิด same_as ที่https://en.cppreference.com/w/cpp/concepts/same_asฉันสังเกตเห็นว่ามีบางสิ่งแปลก ๆ เกิดขึ้น namespace detail { template< class T, class U > concept SameHelper = std::is_same_v<T, U>; } template< class T, class U > concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>; คำถามแรกคือทำไมSameHelperแนวคิดจึงฝังอยู่? ประการที่สองคือทำไมsame_asการตรวจสอบถ้าTเป็นเช่นเดียวกับUและUเช่นเดียวกับT? ไม่ซ้ำซ้อนหรือไม่
19 c++  c++20  concept 

4
ทำไม const char * ไม่ต้องการตัวชี้ไปยังที่อยู่หน่วยความจำ
นี่อาจเป็นคำถามง่าย ๆ แต่ทำไม const char * ไม่จำเป็นต้องระบุที่อยู่หน่วยความจำ ตัวอย่าง: const char* a = "Anthony"; และไม่: const char *a = // Address to const char เหมือนประเภทอื่น ๆ

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