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

C ++ 20 เป็นเป้าหมายสำหรับรุ่น C ++ หลัง C ++ 17 ควรใช้แท็กนี้ (พร้อมกับแท็ก C ++) สำหรับคำถามเกี่ยวกับคุณลักษณะของ C ++ ในการติดตามสำหรับ C ++ 20

1
shift_right () ตั้งใจจะนำไปใช้ใน C ++ 20 อย่างไร
ใน C ++ 20 <algorithm>กำไรส่วนหัวทั้งสองขั้นตอนวิธีการใหม่และshift_left() shift_right()ทั้งสองคนยอมรับ LegacyForwardIterator ใด ๆ สำหรับshift_left()มันระบุไว้ว่า "การเคลื่อนไหวจะดำเนินการเพื่อเพิ่มการiเริ่มต้นจาก​0"; สำหรับshift_right()มันมีการระบุว่า "ถ้าForwardItตรงตามความต้องการ LegacyBidirectionalIterator แล้วย้ายจะดำเนินการในลำดับที่ลดลงของการiเริ่มต้นจากlast - first - n - 1" ฉันคิดว่าวิธีง่าย ๆ ที่จะใช้shift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; …

4
ซ่อนคลาสฐานที่ว่างเปล่าสำหรับการเริ่มต้นรวม
พิจารณารหัสต่อไปนี้: struct A { // No data members //... }; template<typename T, size_t N> struct B : A { T data[N]; } นี่คือวิธีที่คุณต้องเริ่มต้น B: B<int, 3> b = { {}, {1, 2, 3} }; ฉันต้องการหลีกเลี่ยงการว่าง {} ที่ไม่จำเป็นสำหรับคลาสฐาน มีวิธีแก้ปัญหาที่เสนอโดย Jarod42 ที่นี่แต่มันไม่ทำงานกับองค์ประกอบการเริ่มต้นองค์ประกอบ: B<int, 3> b = {1, 2, 3};ดี แต่B<int, 3> b …

1
MSVC เทียบเท่าสำหรับ -fno-char8_t คืออะไร
ใน C ++ 20 u8ตัวอักษรสตริงจะขึ้นอยู่กับchar8_tประเภท พวกเขาจงใจไม่แปลงเป็นchar const*อีกต่อไป: const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20 แน่นอนว่าเป้าหมายสูงสุดเมื่อย้ายไปยัง C ++ 20 คือไปกับพฤติกรรมใหม่ทั้งหมด (ในตัวอย่างด้านบน: เปลี่ยนประเภทของstr) อย่างไรก็ตามเนื่องจากห้องสมุดของบุคคลที่สามจึงไม่สามารถทำได้ในทันที ข้อเสนอที่แนะนำและ"แก้ไข" char8_tคาดการณ์และกล่าวถึงในเสียงดังกราวและ gcc ว่ามีการ-fno-char8_tเปลี่ยนสถานะกลับเป็นพฤติกรรมเก่า (ในขณะที่ยังคงสามารถเพลิดเพลินกับคุณลักษณะ C ++ 20 อื่น ๆ ) ข้อเสนอที่ 2 ตั้งค่าความคาดหวังที่ Microsoft จะติดตามและเพิ่มการตั้งค่าสถานะที่คล้ายกัน แต่ฉันไม่สามารถค้นหาวิธีการตั้งค่าได้ (อย่างน้อยใน VS 2019 เวอร์ชัน 16.4) ดังนั้นใครจะรู้ว่าสิ่งที่เทียบเท่า …

1
มันเป็น UB ที่จะกลับมาทำงานเป็นสมาชิก coroutine ของวัตถุที่อายุการใช้งานสิ้นสุดลงหรือไม่?
คำถามนี้เกิดจากความคิดเห็นนี้: คำอธิบายตลอดอายุการใช้งานแลมบ์ดาสำหรับ coroutines C ++ 20 เกี่ยวกับตัวอย่างนี้: auto foo() -> folly::coro::Task<int> { auto task = []() -> folly::coro::Task<int> { co_return 1; }(); return task; } ดังนั้นคำถามคือการดำเนินการ coroutine กลับโดยfooจะส่งผลใน UB "การเรียก" ฟังก์ชันสมาชิก (หลังจากสิ้นสุดอายุการใช้งานของวัตถุ) คือ UB: http://eel.is/c++draft/basic.life#6.2 ... ตัวชี้ใด ๆ ที่แสดงที่อยู่ของที่เก็บสินค้าซึ่งวัตถุนั้นจะเป็นหรือที่ตั้งอาจถูกนำมาใช้ แต่ในรูปแบบที่ จำกัด เท่านั้น [... ] โปรแกรมมีพฤติกรรมที่ไม่ได้กำหนดหาก: [ ... ] - ตัวชี้ใช้เพื่อเข้าถึงสมาชิกข้อมูลที่ไม่คงที่หรือเรียกใช้ฟังก์ชันสมาชิกแบบไม่คงที่ของวัตถุหรือ …

1
การสร้างวัตถุโดยนัยที่ไม่ระบุ
เนื่องจากP0593 การสร้างวัตถุโดยปริยายสำหรับการจัดการวัตถุระดับต่ำได้รับการยอมรับวัตถุจึงอาจถูกสร้างโดยนัยใน C ++ 20 โดยเฉพาะถ้อยคำที่นำโดยข้อเสนอที่จะช่วยให้การดำเนินการบางอย่าง (เช่นstd::malloc) เพื่อสร้างโดยอัตโนมัติและเริ่มต้นชีวิตของวัตถุบางชนิดที่เรียกว่าประเภทนัยชีวิต , ถ้าการแนะนำของวัตถุดังกล่าวจะทำให้โปรแกรมที่มีพฤติกรรมที่ไม่ได้กำหนดไว้เป็นอย่างอื่นที่จะมี พฤติกรรมที่กำหนดไว้ ดู[intro.object] / 10 ตอนนี้ร่างเพิ่มเติมกล่าวว่าหากมีหลายชุดของวัตถุดังกล่าวที่สามารถสร้างขึ้นโดยปริยายเพื่อให้พฤติกรรมที่กำหนดโปรแกรมมันจะไม่ได้ระบุชุดของชุดเหล่านี้จะถูกสร้างขึ้น (ดูเหมือนว่าประโยคที่เกี่ยวข้องจะไม่ปรากฏในการแก้ไขข้อเสนอล่าสุดที่ฉันสามารถเข้าถึงได้ R5 แต่อยู่ในร่างข้อตกลง) จริง ๆ แล้วมีโปรแกรมที่ตัวเลือกของชุดวัตถุที่สร้างขึ้นโดยปริยายนี้สามารถสังเกตได้หรือไม่? ในคำอื่น ๆ มีโปรแกรมที่มีการกำหนด แต่ไม่ได้ระบุพฤติกรรมผ่านกฎใหม่นี้เช่นว่ามันเป็นไปได้ที่จะอนุมานจากการส่งออกซึ่งชุดประเภทของวัตถุโดยปริยาย (มากกว่าหนึ่งที่เป็นไปได้มากกว่าหนึ่ง) ถูกสร้างขึ้น? หรือประโยคนี้มีความหมายเพียงเพื่อชี้แจงการดำเนินการของโปรแกรมบนเครื่องนามธรรม (โดยไม่มีผลกระทบที่สังเกตได้)?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.