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

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


1
กำหนดค่า CMake ใน windows เพื่อใช้เสียงดังกราวจากบรรทัดคำสั่งเพื่อรับการสนับสนุน OpenMP ที่ทันสมัย
ฉันมีโครงการทดสอบขนาดเล็กที่ใช้ OpenMP สำหรับการขนาน เป้าหมายของฉันคือการรวบรวมมันเพื่อผลิต.dllและ.libสำหรับห้องสมุด (เพราะโครงการจริงของฉันเชื่อมโยงไปยังห้องสมุดภายนอกที่กระจายโดยใช้ประเภทเหล่านี้) ด้วยการสนับสนุน OpenMP 4.5 หรือใหม่กว่าและทำจากบรรทัดคำสั่งเพื่อให้สามารถทำได้บนนักเทียบท่าสำหรับ การทดสอบและตรวจสอบ (ส่วนนักเทียบท่าอยู่นอกขอบเขตของคำถามนี้มันเป็นเพียงสำหรับการอ้างอิงในสาเหตุที่ฉันต้องการให้มันทำงานจากบรรทัดคำสั่ง) ฉันสามารถรวบรวมโครงการนี้ด้วยคอมไพเลอร์ต่าง ๆ ที่ฉันไม่มีความสุข: MSVC: mkdir build-msvcแล้วcmake ..(จากโฟลเดอร์ที่สร้างขึ้นใหม่) cmake --build . --config Releaseและในที่สุด สิ่งนี้รวบรวมได้ดี แต่รองรับ OpenMP 2.0 เท่านั้นดังนั้นจึงไม่ใช่ตัวเลือกที่ดีสำหรับโครงการจริงของฉัน Intel Parallel Studio: mkdir build-intelแล้วcmake .. -T "Intel C++ Compiler 19.0"(จากโฟลเดอร์ที่สร้างขึ้นใหม่) cmake --build . --config Releaseและในที่สุด สิ่งนี้สนับสนุน OpenMP 5.0 แต่ลิขสิทธิ์ของฉันค่อนข้างแพงสำหรับฉัน MinGW x …

2
weak_ptr reset ส่งผลต่อ shared_ptr หรือไม่
ฉันไม่ค่อยชินกับการใช้มากนักweak_ptrและฉันกำลังเผชิญกับสถานการณ์ที่ค่อนข้างสับสน ฉันกำลังใช้การอัพเดท Intel XE 2019 นักแต่งเพลง 5 ( แพ็คเกจ 2019.5.281 ) เมื่อรวมกันกับVisual Studio 2019 เวอร์ชั่น 16.2.5 ฉันรวบรวมใน 64 บิต ผมใช้มาตรฐานC ++ 17 นี่คือรหัสสำหรับการแก้ปัญหาขัดขวางของฉัน: #include <memory> #include <iostream> using namespace std; int main( int argc, char* argv[] ) { shared_ptr<int> sp = make_shared<int>( 42 ); cout << "*sp = " << …

3
ฉันสามารถใช้ std :: transform แบบแทนที่ด้วยนโยบายการดำเนินการแบบขนานได้หรือไม่
ถ้าฉันไม่ผิดฉันสามารถทำให้std::transformการดำเนินการในสถานที่ โดยใช้ช่วงเดียวกับ input และ output iterator สมมติว่าฉันมีstd::vectorวัตถุvecแล้วฉันจะเขียน std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op) unary_opโดยใช้การดำเนินการที่เหมาะสมเอก ด้วยการใช้มาตรฐาน C ++ 17 ฉันต้องการดำเนินการแปลงแบบขนานโดยการใส่std::execution::parเข้าไปในนั้นเป็นอาร์กิวเมนต์แรก นี้จะทำให้ฟังก์ชั่นการเดินทางจากการโอเวอร์โหลด (1) (2) ในบทความ cppreference std::transformบน อย่างไรก็ตามความคิดเห็นที่เกินพิกัดนี้พูดว่า: unary_op[... ] ต้องไม่ทำให้ตัววนซ้ำใด ๆ รวมถึงตัววนซ้ำสิ้นสุดหรือแก้ไของค์ประกอบใด ๆ ของช่วงที่เกี่ยวข้อง (ตั้งแต่ C ++ 11) "แก้ไของค์ประกอบใด ๆ " จริงๆหมายถึงฉันไม่สามารถใช้อัลกอริทึมในสถานที่หรือกำลังพูดถึงรายละเอียดที่แตกต่างที่ฉันตีความผิด?

3
วิธีหลีกเลี่ยงการแปลงโดยนัยจากจำนวนเต็ม 0 ถึงตัวชี้เป็นองค์ประกอบของเวกเตอร์
มีสถานการณ์ที่ฉันต้องการรวบรวมชื่อโหนดทั้งหมดของพา ธ ไปยังคีย์ใน JSON พิจารณาเงื่อนไขของดัชนีอาเรย์ "0", "1" ด้วยเช่นกัน แต่มันก็ง่ายที่จะลืมเครื่องหมายคำพูดซึ่งจะนำไปสู่ความผิดพลาดเมื่อทำการอ้างอิง ดังนั้นฉันต้องการปฏิเสธสิ่งนี้ ตัวอย่าง: #include <vector> #include <iostream> int func(const std::vector<const char*>& pin) { return pin.size(); } int main() { // {"aname", "3", "path", "0"} wanted but this still compile std::cout << func({"aname", "3", "path", 0}) << std::endl; } ฉันพบและลองสิ่งนี้ฉันจะหลีกเลี่ยงการแปลงโดยนัยในฟังก์ชั่นที่ไม่ได้สร้างได้อย่างไร ดังต่อไปนี้: #include <vector> …

7
การลบ () องค์ประกอบในเวกเตอร์ไม่ทำงาน
ฉันมีเวกเตอร์ ฉันต้องการลบองค์ประกอบ 3 ตัวสุดท้ายในนั้น อธิบายตรรกะนี้ โปรแกรมขัดข้อง มีข้อผิดพลาดอะไรบ้าง? vector<float>::iterator d = X.end(); for (size_t i = 1; i < 3; i++) { if (i == 1) X.erase(d); else X.erase(d - i); }
10 c++  vector 

1
เข้าถึงสมาชิกใน struct ผ่านตัวแปรใน C ++
ฉันมีโครงสร้างที่มีสมาชิกสองคนตัวอย่างเช่น: struct DataSet { int x; int y; }; ... และฉันต้องเข้าถึงวิธีดังกล่าว แต่จะทำได้ทีละหนึ่งเท่านั้น: void foo(StructMember dsm) { // ("StructMember" does not exist) DataSet ds; ds.x = 4; ds.y = 6; std::cout << ds.dsm * ds.dsm << std::endl; } foo(x); foo(y); ผลลัพธ์ที่ฉันต้องการ: 16 36 ฉันควรทำอย่างไรเมื่อฉันต้องแก้ปัญหาเช่นนี้ มีประเภทข้อมูลที่สามารถเข้าถึงสมาชิกได้หรือไม่?
10 c++ 

2
การลดชนิดอาร์กิวเมนต์เท็มเพลตเทมเพลต C ++
ฉันมีรหัสที่ค้นหาและพิมพ์การจับคู่ของรูปแบบเหมือนกับการข้ามคอนเทนเนอร์ของสตริง ทำการพิมพ์ในฟังก์ชั่นfooที่เทมเพลต รหัส #include <iostream> #include <algorithm> #include <iterator> #include <vector> #include <string> #include <tuple> #include <utility> template<typename Iterator, template<typename> class Container> void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings) { for (auto const &finding : findings) { std::cout << "pos = " << std::distance(first, finding.first) << " "; std::copy(finding.first, finding.second, …

1
ตัวชี้ทางคณิตศาสตร์ในหน่วยเก็บข้อมูลที่จัดสรรอนุญาตตั้งแต่ C ++ 20 หรือไม่
ใน C ++ 20 มาตรฐานมันก็บอกว่าประเภทอาร์เรย์เป็นประเภทอายุการใช้งานโดยปริยาย หมายความว่าอาเรย์สำหรับประเภทอายุการใช้งานที่ไม่แน่นอนสามารถสร้างได้หรือไม่? การสร้างอาเรย์โดยนัยจะไม่ทำให้เกิดการสร้างองค์ประกอบของอาเรย์? พิจารณากรณีนี้: //implicit creation of an array of std::string //but not the std::string elements: void * ptr = operator new(sizeof (std::string) * 10); //use launder to get a "pointer to object" (which object?) std::string * sptr = std::launder(static_cast<std::string*>(ptr)); //pointer arithmetic on not created array …

1
ทำไม std :: span ไม่มีตัวดำเนินการเปรียบเทียบ
การstd::spanออกแบบที่ไม่ได้เป็นการอ้างอิงที่มีน้ำหนักเบาไปยัง sub-region ของstd::vector/ std::array/ array แบบธรรมดาหรือไม่? มันควรจะมีตัวดำเนินการเปรียบเทียบใน API ของมันหรือไม่เพื่อให้สอดคล้องกับพวกเขา อะไรคือเหตุผลเบื้องหลังการยกเว้น หมายเหตุ: โดยผู้ประกอบการเปรียบเทียบผมหมายถึงทั้งชุดเต็ม ( <, <=, ... ) หรือยานอวกาศ<=>
10 c++  std  c++20  std-span 

3
การตัดทอนเลขจำนวนเต็มบิทฟิลด์ที่ไม่ได้ลงนามระหว่าง C ++ และ C ที่ไม่สอดคล้องกันในคอมไพเลอร์ต่างกัน
แก้ไข 2 : ฉันแก้ไขข้อผิดพลาดในการทดสอบที่ผิดปกติเมื่อฟังก์ชั่นก่อนหน้านี้อาศัยอยู่ในไฟล์ต้นฉบับ C ++ แต่ย้ายไปเป็นคำต่อคำของไฟล์ C เริ่มส่งคืนผลลัพธ์ที่ไม่ถูกต้อง MVE ด้านล่างอนุญาตให้สร้างปัญหาขึ้นอีกครั้งด้วย GCC อย่างไรก็ตามเมื่อฉันตั้งใจรวบรวมตัวอย่างกับ Clang (และต่อมากับ VS) ฉันได้ผลลัพธ์ที่ต่างออกไป! ฉันไม่สามารถคิดได้ว่าจะจัดการสิ่งนี้เป็นข้อบกพร่องในคอมไพเลอร์ตัวใดตัวหนึ่งหรือเป็นการรวมตัวของผลลัพธ์ที่ไม่ได้กำหนดซึ่งอนุญาตโดยมาตรฐาน C หรือ C ++ แปลกไม่มีคอมไพเลอร์ให้คำเตือนใด ๆ เกี่ยวกับการแสดงออก ผู้ร้ายคือการแสดงออกนี้: ctl.b.p52 << 12; ที่นี่p52พิมพ์เป็นuint64_t; มันยังเป็นส่วนหนึ่งของสหภาพ (ดูcontrol_tด้านล่าง) การดำเนินการกะจะไม่สูญเสียข้อมูลใด ๆ เนื่องจากผลลัพธ์ยังพอดีกับ 64 บิต อย่างไรก็ตาม GCC ตัดสินใจตัดทอนผลลัพธ์เป็น 52 บิตหากฉันใช้คอมไพเลอร์ C ! ด้วยคอมไพเลอร์ C ++ ผลลัพธ์ 64 บิตทั้งหมดจะถูกเก็บไว้ …

1
เหตุใดจึงไม่สามารถใช้ช่วงสำหรับการทำงานของไลบรารีของไพพ์
โจนาธาน Boccara (ผู้เขียนเหมือนเจ้าของภาษา C ++ ) เขียนห้องสมุดที่เรียกว่าท่อ "piping" หน้าหลักของที่เก็บกล่าวว่าไม่เหมือนกับการใช้ช่วงแม้ว่ามันจะดูเหมือนกัน: มันไม่ได้ขึ้นอยู่กับการดึงแบบขี้เกียจ แต่อยากที่จะผลักดัน แต่มันระบุไว้ว่าเราไม่สามารถใช้ไลบรารีช่วงเพื่อดำเนินการ 'ไปป์' ที่หลากหลาย ตัวอย่างเช่น: เปิดเครื่องรูด - รับอินพุตซิป - ช่วงของ k-tuples เป็นหลัก - และสร้างเอาต์พุตแยกอิสระ k fork - สร้างสำเนาของคอนเทนเนอร์ / พิสัยหลายชุด (อิสระ) ฉันไม่เข้าใจว่าทำไมในหลักการแล้วเป็นกรณีนี้ (แน่นอนว่ามีข้อยกเว้นของช่วงที่คุณไม่สามารถรับตัววนซ้ำสุดท้าย / Sentinel ได้)

3
สามารถแปลง nullptr เป็น uintptr_t ได้หรือไม่ คอมไพเลอร์ไม่เห็นด้วย
พิจารณาโปรแกรมนี้: #include <cstdint> using my_time_t = uintptr_t; int main() { const my_time_t t = my_time_t(nullptr); } ไม่สามารถคอมไพล์ด้วย msvc v19.24: <source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t' <source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type <source>(5): error C2789: …
10 c++  c++11  gcc  visual-c++  clang 

1
การตรวจสอบแนวคิด TS ไม่สนใจตัวแก้ไขการเข้าถึงส่วนตัว
ฉันต้องการเขียนแนวคิดที่สามารถจัดทำดัชนีความหมายว่าลำดับที่มีเริ่มต้น / สิ้นสุดที่ส่งกลับ RandomAccessIterator หรือผู้ประกอบการ [] ถูกกำหนดและส่งกลับค่าประเภทที่ไม่เป็นโมฆะ ฉันใช้แนวคิดจากบทความของ Stroustrupสำหรับแนวคิด Sequence และเติมด้วย: template <class T> concept bool Indexable = Sequence<T> || requires(T t, size_t n) { { t[n] } -> NotVoid; }; สามารถใช้งานได้ในกรณีส่วนใหญ่ แต่ล้มเหลวในกรณีต่อไปนี้ struct Bad { std::vector<int> nums; private: int& operator[](size_t ind) { return nums[ind]; } }; static_assert(!Indexable<Bad>, "fail"); ด้วยเหตุผลบางอย่างที่คอนเซ็ปต์ของฉันเพิกเฉยต่อความจริงที่ว่าตัวดำเนินการ …
10 c++  c++-concepts 

1
ปัญหาใน GCC / C ++ 17 พร้อมคลาสเทมเพลตเทมเพลต
พิจารณาโอเวอร์โหลด 2 ตัวต่อไปนี้ template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } อันที่หนึ่งใช้ได้กับคลาสปกติขณะที่อันที่สองใช้ได้กับเทมเพลตที่ไม่ได้สร้างอินสแตนซ์ ตัวอย่างเช่น std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 ตอนนี้ให้พิจารณาฟังก์ชั่นเทมเพลตต่อไปนี้: template<typename U> bool templfun(){ struct A{ bool f(){ return test<A>(); // <-- this gives an error } …
10 c++  templates  gcc  clang  c++17 

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