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

C ++ 17 เป็นชื่อของมาตรฐาน C ++ ที่ได้รับการอนุมัติในปี 2017 มันสร้างตามมาตรฐาน C ++ 14 ก่อนหน้าปรับปรุงภาษาแกนกลางและไลบรารีมาตรฐานและเพิ่มคุณสมบัติภาษาใหม่บางอย่าง

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) "แก้ไของค์ประกอบใด ๆ " จริงๆหมายถึงฉันไม่สามารถใช้อัลกอริทึมในสถานที่หรือกำลังพูดถึงรายละเอียดที่แตกต่างที่ฉันตีความผิด?

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 

2
การหักอาร์กิวเมนต์เทมเพลตสำหรับอาร์กิวเมนต์ของประเภทฟังก์ชั่น
พิจารณาโปรแกรมต่อไปนี้ #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } โปรแกรมคอมไพล์ได้สำเร็จและผลลัพธ์คือ g( 42 ); ตอนนี้ขอเปลี่ยนชื่อฟังก์ชั่นที่ไม่ใช่แม่แบบเพื่อgf #include <iostream> …

5
ทำไมฉันไม่สามารถดึงข้อมูลดัชนีของตัวแปรและใช้เพื่อรับเนื้อหาได้
ฉันพยายามเข้าถึงเนื้อหาของตัวแปร ฉันไม่รู้ว่ามีอะไรในนั้น แต่โชคดีที่ตัวแปรนี้ทำ ดังนั้นฉันคิดว่าฉันจะถามตัวแปรว่าดัชนีนั้นเปิดอยู่จากนั้นใช้ดัชนีนั้นกับstd::getเนื้อหา แต่นี่ไม่ได้รวบรวม: #include <variant> int main() { std::variant<int, float, char> var { 42.0F }; const std::size_t idx = var.index(); auto res = std::get<idx>(var); return 0; } ข้อผิดพลาดเกิดขึ้นในการstd::getโทร: error: no matching function for call to ‘get<idx>(std::variant<int, float, char>&)’ auto res = std::get<idx>(var); ^ In file included from /usr/include/c++/8/variant:37, …
10 c++  c++17  variant 

2
คุณต้องการสตริงที่สิ้นสุดด้วยค่า null ในสถานการณ์แบบอ่านอย่างเดียวเมื่อใด
ฉันได้เล่นกับstd::string_viewห้องสมุดและฉันได้ไตร่ตรองเกี่ยวกับการเปลี่ยนรหัสฐานที่ฉันได้พยายามใช้std::string_viewให้มากที่สุด อย่างไรก็ตามในหลายหัวข้อที่ผมได้อ่านในเรื่องของเวลาและสถานที่ที่จะใช้แทนstd::string_view const std::string &ฉันเห็นคำตอบมากมายว่า "เมื่อคุณไม่ต้องการสตริงที่สิ้นสุดด้วยค่า null" ดังนั้นเมื่อฉันเริ่มค้นหาเว็บ "คุณต้องการสตริงที่สิ้นสุดด้วยค่า null เมื่อใด" ฉันไม่ได้เจอคำตอบที่เป็นประโยชน์ในเรื่องนี้จริงๆ ฉันนึกถึงตัวอย่างของstd::stringไลบรารี่ภายนอกที่คุณจะต้องลิงค์ไปถึง และในกรณีนั้นคุณจะต้องใช้สตริงที่สิ้นสุดด้วยค่า null เนื่องจากไลบรารีนั้นต้องการ ฉันเดาอีกตัวอย่างหนึ่งคือหากคุณต้องการแก้ไขสตริงเอง แต่จากนั้นเราจะไม่ผ่านมันconst &หากเราต้องการแก้ไขมัน ดังนั้นเมื่อใดที่คุณจะต้องใช้สตริงที่สิ้นสุดด้วยค่า Null? ลิงค์ที่ฉันได้ดู: std :: string_view เร็วกว่า const std :: string & อย่างไร เมื่อใดที่ฉันจะส่งผ่าน const & std :: string แทนที่จะเป็น std :: string_view เหตุใดจึงต้องดูสตริง มีความหมายในการใช้ const std :: string & arguments …

2
วิธีการคัดลอกเมื่อผูกมัด?
ฉันกำลังสร้างคลาสของการผูกมัดประเภทเช่นตัวอย่างเล็ก ๆ ด้านล่าง ดูเหมือนว่าเมื่อการเชื่อมโยงสมาชิกฟังก์ชันแล้วตัวสร้างการคัดลอกจะถูกเรียกใช้ มีวิธีกำจัด call constructor ของการคัดลอกหรือไม่? ในตัวอย่างของเล่นของฉันด้านล่างเป็นที่ชัดเจนว่าฉันกำลังจัดการกับขมับเท่านั้นและดังนั้นจึงมี "ควร" (อาจไม่ได้ตามมาตรฐาน ตัวเลือกที่ดีที่สุดอันดับที่สองคือการคัดลอกตัวเลือกจะเป็นตัวสร้างการย้ายที่จะถูกเรียก แต่ไม่ใช่ในกรณีนี้ class test_class { private: int i = 5; public: test_class(int i) : i(i) {} test_class(const test_class& t) { i = t.i; std::cout << "Copy constructor"<< std::endl; } test_class(test_class&& t) { i = t.i; std::cout << "Move constructor"<< …
10 c++  c++14  c++17 

2
มีวิธีในการสร้าง stringstream จาก string_view โดยไม่คัดลอกข้อมูลหรือไม่
ฉันคิดว่านั่นเป็นคำถามที่ค่อนข้างตรงไปตรงมา ฉันต้องการใช้โดยเฉพาะstd::get_timeแต่ต้องการกระแสข้อมูลบางประเภทเพื่อใช้กับ ฉันกำลังส่งผ่านข้อมูลในstring_viewและต้องการหลีกเลี่ยงการคัดลอกเพียงเพื่อแยกวันที่

2
อะไรรับประกันกับ C ++ std :: atomic ในระดับโปรแกรมเมอร์?
ฉันได้ฟังและอ่านบทความพูดคุยและคำถามเกี่ยวกับสแต็คโอเวอร์โฟลว์หลายเรื่องstd::atomicแล้วและฉันต้องการให้แน่ใจว่าฉันเข้าใจดี เนื่องจากฉันยังสับสนอยู่เล็กน้อยกับบรรทัดแคชเขียนการมองเห็นเนื่องจากความล่าช้าที่เป็นไปได้ในโปรโตคอลการเชื่อมโยงกันของแคช MESI (หรือที่ได้รับ) บัฟเฟอร์ที่เก็บบัฟเฟอร์คิวที่ไม่ถูกต้องและอื่น ๆ ฉันอ่าน x86 มีโมเดลหน่วยความจำที่แรงกว่าและหากการตรวจสอบความถูกต้องแคชล่าช้า x86 สามารถยกเลิกการดำเนินการที่เริ่มต้นได้ แต่ตอนนี้ฉันสนใจเฉพาะสิ่งที่ฉันควรถือว่าเป็นโปรแกรมเมอร์ C ++ ซึ่งเป็นอิสระจากแพลตฟอร์ม [T1: thread1 T2: thread2 V1: ตัวแปรอะตอมมิกที่ใช้ร่วมกัน] ฉันเข้าใจว่า std :: atomic รับประกันว่า (1) ไม่มีการแย่งข้อมูลในตัวแปร (ต้องขอบคุณการเข้าถึงสายแคชเท่านั้น) (2) หน่วยความจำที่เราใช้นั้นขึ้นอยู่กับหน่วยความจำที่รับประกันว่า (มีสิ่งกีดขวาง) ซึ่งความสอดคล้องตามลำดับจะเกิดขึ้น (3) หลังจากการเขียนอะตอมมิก (V1) บน T1 อะตอมมิก RMW (V1) บน T2 จะสอดคล้องกัน (บรรทัดแคชจะได้รับการอัพเดตด้วยค่าที่เขียนบน T1) แต่เมื่อไพรเมอร์เชื่อมโยงกันถึงแคช ความหมายของสิ่งเหล่านี้คือโดยค่าเริ่มต้นการโหลดสามารถดึงข้อมูลเก่า (ถ้าคำขอการตรวจสอบความถูกต้องที่สอดคล้องกันกำลังนั่งอยู่ในคิวการตรวจสอบความถูกต้อง) ดังนั้นถูกต้องหรือไม่ …

1
ลำดับการดำเนินการของตัวดำเนินการใหม่และอาร์กิวเมนต์ของตัวสร้าง
ไม่ c ++ spec ระบุลำดับoperator newและคอนสตรัคของในA กรัม ++ ให้การสั่งซื้อจะ-> -> แต่เสียงดังกราว ++ ให้มันเป็น-> -> ความแตกต่างเกิดจากพฤติกรรมที่ไม่ระบุหรือไม่?new C(A())A()newC()newA()C() g ++: 7.4.0 clang ++: 10.0.0 #include <iostream> #include <cstdlib> struct A { A() { std::cout << "call A()\n"; } }; struct C { C(A) { std::cout << "call S()\n"; } void *operator new(size_t …

2
ไวยากรณ์ที่ถูกต้องของการเรียกใช้ pseudo-destructor สำหรับค่าคงที่แบบลอยตัว
พิจารณาโปรแกรมสาธิตต่อไปนี้ #include <iostream> int main() { typedef float T; 0.f.T::~T(); } Microsoft Visual Studio Community 2019โปรแกรมนี้เป็นโปรแกรมที่รวบรวมโดย แต่clangและgccออกข้อผิดพลาดเช่นนี้ prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T' 7 | 0.f.T::~T(); | ^~~~~ หากต้องการเขียนนิพจน์เช่น( 0.f ).T::~T()นั้นคอมไพเลอร์ทั้งสามจะคอมไพล์โปรแกรม ดังนั้นคำถามที่เกิดขึ้น: บันทึกนี้0.f.T::~T()ถูกต้องตามหลักไวยากรณ์หรือไม่ และถ้าไม่เช่นนั้นกฎเกี่ยวกับวากยสัมพันธ์คืออะไร?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.