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

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

4
ทดลอง :: ข้อผิดพลาดตัวเชื่อมโยงระบบไฟล์
ฉันพยายามใช้คุณสมบัติ c ++ 1z ใหม่ที่เป็นจริงในส่วนหัวของการพัฒนาภายใน gcc 6.0 ถ้าฉันลองตัวอย่างเล็กน้อยนี้: #include <iostream> #include <experimental/filesystem> namespace fs = std::experimental::filesystem; int main() { fs::path p1 = "/home/pete/checkit"; std::cout << "p1 = " << p1 << std::endl; } ฉันได้: / opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 …
98 c++  gcc  c++17 

2
วิธีรับขนาดไฟล์เป็นไบต์ด้วย C ++ 17
มีข้อผิดพลาดสำหรับระบบปฏิบัติการเฉพาะที่ฉันควรรู้หรือไม่? คำถามนี้มีคำซ้ำหลายรายการ ( 1 , 2 , 3 , 4 , 5 ) แต่ได้รับคำตอบเมื่อหลายสิบปีก่อน คำตอบที่ได้รับการโหวตสูงมากในหลายคำถามเหล่านี้ผิดในปัจจุบัน วิธีการจากอื่น ๆ (QA เก่า) บน. sx stat.h (wrapper sprintstatf ) ใช้ syscall tellg ()ผลตอบแทนต่อความหมายตำแหน่งแต่ไม่จำเป็นต้องไบต์ intประเภทผลตอบแทนไม่ได้

6
เหตุใดจึงต้องใช้ std :: make_unique ใน C ++ 17
เท่าที่ฉันเข้าใจ C ++ 14 แนะนำstd::make_uniqueเนื่องจากไม่ได้ระบุลำดับการประเมินพารามิเตอร์สิ่งนี้ไม่ปลอดภัย: f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A (คำอธิบาย: หากการประเมินจัดสรรหน่วยความจำให้กับตัวชี้ดิบเป็นอันดับแรกการเรียกใช้g()และข้อยกเว้นจะเกิดขึ้นก่อนการstd::unique_ptrสร้างหน่วยความจำจะรั่วไหล) การโทรstd::make_uniqueเป็นวิธีการ จำกัด ลำดับการโทรซึ่งทำให้สิ่งต่างๆปลอดภัย: f(std::make_unique<MyClass>(param), g()); // Syntax B ตั้งแต่นั้นมา, C ++ 17 ได้ชี้แจงเพื่อการประเมินผลที่ทำให้ไวยากรณ์ปลอดภัยเกินไปดังนั้นนี่คือคำถามของฉัน: คือยังคงมีเหตุผลที่จะใช้std::make_uniqueมากกว่าstd::unique_ptr's constructor ใน C ++ 17? คุณสามารถยกตัวอย่างได้หรือไม่? ณ ตอนนี้เหตุผลเดียวที่ฉันนึกได้คืออนุญาตให้พิมพ์ได้MyClassเพียงครั้งเดียว (สมมติว่าคุณไม่จำเป็นต้องพึ่งพาความหลากหลายด้วยstd::unique_ptr<Base>(new Derived(param))) อย่างไรก็ตามนั่นดูเหมือนเป็นเหตุผลที่ค่อนข้างอ่อนแอโดยเฉพาะอย่างยิ่งเมื่อstd::make_uniqueไม่อนุญาตให้ระบุ deleter ในขณะที่ตัวstd::unique_ptrสร้างทำ และเพื่อความชัดเจนฉันไม่สนับสนุนให้ลบออกstd::make_uniqueจาก Standard Library (อย่างน้อยก็เหมาะสมสำหรับความเข้ากันได้แบบย้อนหลัง) แต่ค่อนข้างสงสัยว่ายังมีสถานการณ์ที่ต้องการอย่างยิ่งstd::unique_ptr
98 c++  c++17  unique-ptr 

3
C ++ 17 มีการรับประกันลำดับการประเมินอะไรบ้าง
ผลกระทบของการโหวตใน การรับประกันลำดับการประเมิน C ++ 17 (P0145)ในรหัส C ++ ทั่วไป สิ่งต่อไปนี้มีการเปลี่ยนแปลงอย่างไร i = 1; f(i++, i) และ std::cout << f() << f() << f(); หรือ f(g(), h(), j());

3
ข้อมูลประเภทไหลย้อนกลับใน C ++ เมื่อใด
ฉันเพิ่งดู Stephan T. Lavavej พูดในCppCon 2018เรื่อง "Class Template Argument Deduction" ซึ่งในบางครั้งเขาก็พูดว่า: ข้อมูลชนิด C ++ เกือบจะไม่ไหลย้อนกลับ ... ผมต้องพูดว่า "เกือบ" เพราะมีหนึ่งหรือสองกรณีอาจจะมากกว่า แต่น้อยมาก แม้จะพยายามคิดว่ากรณีใดที่เขาอาจอ้างถึง แต่ฉันก็คิดอะไรไม่ออก ดังนั้นคำถาม: ในกรณีใดบ้างที่มาตรฐาน C ++ 17 กำหนดให้ข้อมูลประเภทเผยแพร่ย้อนกลับ

1
รับประกันสำเนาถูกต้องอย่างไร?
ในการประชุมมาตรฐาน ISO C ++ ของ Oulu ปี 2016 ข้อเสนอที่เรียกว่าการคัดลอกรับประกันผ่านหมวดหมู่ค่าแบบง่ายได้รับการโหวตให้เป็น C ++ 17 โดยคณะกรรมการมาตรฐาน รับประกันสำเนาถูกต้องอย่างไร? ครอบคลุมบางกรณีที่ได้รับอนุญาตให้คัดลอกสำเนาแล้วหรือจำเป็นต้องมีการเปลี่ยนแปลงรหัสเพื่อรับประกันการลอกสำเนาหรือไม่

1
คำแนะนำการหักเทมเพลตคืออะไรและเราควรใช้เมื่อใด
มาตรฐาน C ++ 17 แนะนำ "คำแนะนำการหักเทมเพลต" ฉันรวบรวมสิ่งเหล่านี้เกี่ยวกับการหักอาร์กิวเมนต์แม่แบบใหม่สำหรับตัวสร้างที่นำมาใช้ในมาตรฐานเวอร์ชันนี้ แต่ฉันยังไม่เห็นคำอธิบายง่ายๆสไตล์คำถามที่พบบ่อยว่าพวกเขาคืออะไรและมีไว้เพื่ออะไร คำแนะนำการหักเทมเพลตใน C ++ 17 คืออะไร? ทำไม (และเมื่อ) เราต้องการพวกเขา? ฉันจะประกาศได้อย่างไร?

4
ฟีเจอร์ทดลองของ C ++ สมัยใหม่เชื่อถือได้สำหรับโครงการระยะยาวหรือไม่?
ฉันมีโปรเจ็กต์ที่ใช้ C ++ 11/14 อยู่ในขณะนี้ แต่มันต้องการบางอย่างเช่นstd::filesystemซึ่งมีเฉพาะใน C ++ 17 เท่านั้นดังนั้นฉันจึงไม่มีโอกาสใช้มันในตอนนี้ อย่างไรก็ตามฉันเห็นว่ามีอยู่ในคอมไพเลอร์ปัจจุบันของฉันในชื่อstd::experimental::filesystemไฟล์. เป็นความคิดที่ดีไหมที่จะใช้ฟีเจอร์ทดลองโดยสมมติว่าในอนาคตฉันสามารถเพิ่มสิ่งต่างๆเช่น: #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif ข้อกังวลของฉันคือ: 1. รับประกันหรือไม่ว่าคอมไพเลอร์ที่เข้ากันได้ทั้งหมดมีคุณสมบัติการทดลองเหมือนกัน? 2. ฟีเจอร์ทดลองมีแนวโน้มที่จะเกิดการเปลี่ยนแปลงครั้งใหญ่ที่ทำให้ไม่น่าเชื่อถือหรือไม่? อาจจะมีอะไรให้สงสัยอีก เหตุใดฉันจึงควรหรือไม่ควรใช้ ฉันงงงวยกับโครงการใหม่และไม่รู้ว่าจะตัดสินใจอะไร

1
เหตุใด GCC จึงเตือนฉันเกี่ยวกับการล้มเหลวแม้ว่าฉันจะใช้ [[fallthrough]]
ในส่วนของโค้ดต่อไปนี้ฉันใช้[[fallthrough]]แอตทริบิวต์มาตรฐานจาก C ++ 1z เพื่อจัดทำเอกสารว่าต้องการการล่มสลาย: #include <iostream> int main() { switch (0) { case 0: std::cout << "a\n"; [[fallthrough]] case 1: std::cout << "b\n"; break; } } ด้วย GCC 7.1 โค้ดจะคอมไพล์โดยไม่มีข้อผิดพลาด อย่างไรก็ตามคอมไพเลอร์ยังคงเตือนฉันเกี่ยวกับการล่มสลาย: warning: this statement may fall through [-Wimplicit-fallthrough=] std::cout << "a\n"; ~~~~~~~~~~^~~~~~~~ ทำไม?

5
วิธีรับแอดเดรสของฟังก์ชันแลมบ์ดา C ++ ภายในแลมบ์ดาเองได้อย่างไร
ฉันกำลังพยายามหาวิธีรับที่อยู่ของฟังก์ชันแลมบ์ดาภายในตัวเอง นี่คือตัวอย่างรหัส: []() { std::cout << "Address of this lambda function is => " << ???? }(); ฉันรู้ว่าฉันสามารถจับแลมบ์ดาในตัวแปรและพิมพ์ที่อยู่ได้ แต่ฉันต้องการทำสิ่งนี้เมื่อฟังก์ชันที่ไม่ระบุตัวตนกำลังดำเนินการ มีวิธีที่ง่ายกว่านี้หรือไม่?
53 c++  c++11  lambda  c++14  c++17 

2
ทำไม Remove_reference ไม่ทำงานกับฟังก์ชั่น?
วิ่งเข้าไปหาสิ่งที่แปลกประหลาดเมื่อทำเทมเพลต metaprogramming บางวัน โดยพื้นฐานแล้วมาจากการยืนยันนี้ไม่ผ่าน (อย่างที่ฉันคาดหวัง) static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); ตอนแรกฉันคิดว่าฉันทำผิดพลาดทางไวยากรณ์ที่กำหนดฟังก์ชันอ้างอิง แต่การยืนยันนี้ผ่านไปโดยแสดงว่าไม่เป็นเช่นนั้น static_assert(std::is_same_v<void()&, void()&>); ฉันยังลองใช้remove_referenceตัวเองเพื่อคัดลอกแหล่งที่มาจาก cppreference แต่ก็ไม่ได้ผลเช่นกัน เกิดขึ้นที่นี่คืออะไร?
38 c++  templates  types  c++17 

4
วิธีการเปรียบเทียบลายเซ็นของทั้งสองฟังก์ชั่น?
มีวิธีการตรวจสอบว่าทั้งสองฟังก์ชั่นมีลายเซ็นเหมือนกันหรือไม่? ตัวอย่างเช่น: int funA (int a, int b); int funB (int a, int b); float funC (int a, int b); int funD (float a, int b); ในตัวอย่างนี้funAและเป็นชุดเดียวของฟังก์ชั่นที่ควรจะกลับfunBtrue

2
วิธีการเริ่มต้น C ++ 17 เวกเตอร์ของคู่ด้วยองค์ประกอบเสริม
ใน C ++ 17 คุณจะประกาศและกำหนดค่าเริ่มต้นเวกเตอร์ของคู่ (หรือ tuples) ด้วยองค์ประกอบเสริมได้อย่างไร std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true}, {2, false}, {3, nullptr}}; ฉันมีคู่ที่องค์ประกอบที่สองอาจเป็นโมฆะ / ไม่จำเป็น

1
ชั้นไม่สามารถเข้าถึงวิธี constexpr คงที่ส่วนตัวของตัวเอง - ข้อผิดพลาดดังกราว?
รหัสนี้ไม่ได้รวบรวมใน Clang (6,7,8,9 ลำตัว) แต่รวบรวมได้ใน GCC (7.1, 8.1, 9.1): template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder<bool>{}; } else { return TypeHolder<T>{}; } } public: template<class T> …

3
เหตุใดจึงเลือกตัวดำเนินการแปลงเกินพิกัดนี้
พิจารณารหัสต่อไปนี้ struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } ที่นี่ผู้ประกอบการแปลงที่สองถูกเลือกโดยความละเอียดเกินพิกัด ทำไม? เท่าที่ฉันเข้าใจผู้ประกอบการทั้งสองจะอนุมานoperator int &&() constและoperator int &() constตามลำดับ ทั้งสองอยู่ในชุดของฟังก์ชันที่ทำงานได้ การอ่านผ่าน [over.match.best] ไม่ได้ช่วยฉันหาสาเหตุว่าทำไมสิ่งหลังถึงดีกว่า เหตุใดฟังก์ชันหลังจึงดีกว่ารุ่นก่อน

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