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

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

3
usecase คืออะไรสำหรับชัดแจ้ง (บูล)
C ++ 20 แนะนำชัดแจ้ง (บูล)ซึ่งเลือกตามเงื่อนไขในเวลาคอมไพล์ไม่ว่าคอนสตรัคเตอร์จะถูกสร้างขึ้นมาอย่างชัดเจนหรือไม่ ด้านล่างเป็นตัวอย่างที่ผมพบว่าที่นี่ struct foo { // Specify non-integral types (strings, floats, etc.) require explicit construction. template <typename T> explicit(!std::is_integral_v<T>) foo(T) {} }; foo a = 123; // OK foo b = "123"; // ERROR: explicit constructor is not a candidate (explicit specifier evaluates to true) foo …
24 c++  c++20  explicit 

3
C ++ 20 Concepts: ความเชี่ยวชาญเทมเพลตใดที่ได้รับเลือกเมื่ออาร์กิวเมนต์เทมเพลตนั้นมีคุณสมบัติเหมาะสมสำหรับหลายแนวคิด
ให้: #include <concepts> #include <iostream> template<class T> struct wrapper; template<std::signed_integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "signed_integral" << std::endl; } }; template<std::integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "integral" << std::endl; } }; int main() { wrapper<int> w; …

1
'auto' เป็นตัวยึดอาร์กิวเมนต์เทมเพลตสำหรับพารามิเตอร์ฟังก์ชัน
C ++ 20 อนุญาตให้ใช้autoสำหรับประเภทพารามิเตอร์ฟังก์ชัน มันยังอนุญาตให้ใช้autoเป็นตัวยึดอาร์กิวเมนต์เทมเพลต (ไม่เหมือนกัน แต่ในจิตวิญญาณของเทมเพลต C ++ 17 <auto>ในทางใดทางหนึ่ง) สำหรับประเภทพารามิเตอร์ฟังก์ชันหรือไม่ ดังนั้นรหัสต่อไปนี้ก่อน C ++ 20: template<typename First, typename Second> void printPair(const std::pair<First, Second>& p) { std::cout << p.first << ", " << p.second; } สามารถเขียนเป็น: void printPair(const std::pair<auto, auto>& p) { std::cout << p.first << ", " << p.second; …
22 c++  templates  auto  c++20 

1
การใช้ตัวแปรใน initializer ของตัวเอง
[basic.scope.pdecl] / 1ของร่างมาตรฐาน C ++ 20 มีตัวอย่าง (ไม่ใช่กฎเกณฑ์) ดังต่อไปนี้ในบันทึกย่อ (อ้างบางส่วนจากก่อนที่จะรวมคำขอดึง 3580ดูคำตอบสำหรับคำถามนี้): unsigned char x = x; [... ] x ถูกเตรียมใช้งานด้วยค่าของตัวเอง (ไม่ทราบแน่ชัด) สิ่งนี้มีพฤติกรรมที่ชัดเจนใน C ++ 20 หรือไม่ โดยทั่วไปการกำหนดค่าเริ่มต้นด้วยตนเองของแบบฟอร์มT x = x;จะมีพฤติกรรมที่ไม่ได้กำหนดโดยอาศัยคุณค่าของxการไม่ได้กำหนดค่าก่อนที่การเริ่มต้นจะเสร็จสมบูรณ์ การประเมินค่าที่ไม่ทราบแน่ชัดมักทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด ( [basic.indent] / 2 ) แต่มีข้อยกเว้นเฉพาะใน[basic.indent] /2.3ที่อนุญาตให้เริ่มต้นunsigned charตัวแปรโดยตรงจากค่า lvalue unsigned charด้วยค่าที่ไม่ทราบแน่ชัด ) นี้เพียงอย่างเดียวไม่ดังนั้นจึงไม่ก่อให้เกิดพฤติกรรมที่ไม่ได้กำหนด แต่จะประเภทอื่น ๆTที่ไม่ได้รับการรับรองรูปแบบตัวอักษรหรือแคบเช่นstd::byte int x = x;ข้อควรพิจารณาเหล่านี้มีผลใน …

2
การเป็นประเภท POD เทียบเท่ากับประเภทเลย์เอาต์มาตรฐานหรือไม่?
ใน C ++ 20 แนวคิดของ POD ถูกคัดค้านเนื่องจากเป็นลักษณะประกอบที่ไม่มีความหมายว่าเป็นเรื่องไร้สาระและมีรูปแบบมาตรฐาน อย่างไรก็ตามคำจำกัดความของ PODในร่าง C ++ 20 นั้นไม่ตรงกับ "ทั้งเรื่องธรรมดาและเลย์เอาต์มาตรฐาน" มันเป็นจริง: คลาส POD เป็นคลาสที่มีทั้งคลาสที่ไม่สำคัญและคลาสเลย์เอาต์มาตรฐานและไม่มีสมาชิกข้อมูลที่ไม่ใช่แบบคงที่ประเภทคลาสที่ไม่ใช่ POD (หรืออาร์เรย์ดังกล่าว) ประเภท POD เป็นประเภทสเกลาร์, คลาส POD, อาร์เรย์ของประเภทดังกล่าวหรือรุ่นที่ผ่านการรับรอง cv ของหนึ่งในประเภทเหล่านี้ กล่าวอีกนัยหนึ่งไม่เพียง แต่จะเป็นประเภท POD ทั้งรูปแบบไม่สำคัญและรูปแบบมาตรฐาน แต่ก็มีรูปแบบซ้ำ ๆ ข้อกำหนดแบบเรียกซ้ำซ้อนนี้ซ้ำซ้อนหรือไม่ กล่าวอีกนัยหนึ่งถ้าประเภทมีทั้งแบบธรรมดาและแบบเลย์เอาต์มันจะเป็นแบบไม่สำคัญและแบบมาตรฐานแบบซ้ำ ๆ โดยอัตโนมัติหรือไม่? หากคำตอบคือ "ไม่" ดังนั้นตัวอย่างของเลย์เอาต์มาตรฐานประเภทเล็ก ๆ น้อย ๆ ที่ไม่ได้เป็น POD คืออะไร

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
enum C ++ ต่อเนื่อง 11
มีวิธีการเช็คอินใน C ++ 11 ไหมถ้า enum ต่อเนื่องหรือไม่? มันถูกต้องอย่างสมบูรณ์เพื่อให้ค่า enum ที่ไม่ได้ อาจมีคุณสมบัติเช่นลักษณะประเภทใน C ++ 14, C ++ 17 หรืออาจ C ++ 20 เพื่อตรวจสอบว่า enum เป็นแบบต่อเนื่องหรือไม่ สิ่งนี้จะใช้ใน static_assert ตัวอย่างเล็ก ๆ ดังนี้: enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, …
17 c++  c++11  c++14  c++17  c++20 

1
เหตุใดไฟล์จัดการมาตรฐาน C ++ จึงหาวิธีการใช้งาน
C ++ ใช้streamoffชนิดเพื่อแสดงออฟเซ็ตภายในสตรีม (ไฟล์) และกำหนดไว้ดังนี้ใน [stream.types]: using streamoff = implementation-defined ; ประเภท streamoff เป็นคำพ้องความหมายสำหรับหนึ่งในประเภทอินทิกรัลพื้นฐานที่ลงนามแล้วซึ่งมีขนาดเพียงพอที่จะแสดงขนาดไฟล์สูงสุดที่เป็นไปได้สำหรับระบบปฏิบัติการ 287) 287) ความยาวโดยทั่วไป สิ่งนี้สมเหตุสมผลเนื่องจากอนุญาตให้ค้นหาไฟล์ขนาดใหญ่ (ต่างจากการใช้longซึ่งอาจมีความกว้างเพียง 32 บิต) [filebuf.virtuals] กำหนดbasic_filebufฟังก์ชั่นของการค้นหาภายในไฟล์ดังนี้: pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; off_typeเทียบเท่ากับstreamoffดู [iostreams.limits.pos] อย่างไรก็ตามมาตรฐานก็จะอธิบายผลกระทบของฟังก์ชั่น ฉันรู้สึกหงุดหงิดกับประโยคสุดท้ายที่ต้องเรียกร้องให้fseek: ผลกระทบ : อนุญาตwidthแสดงa_codecvt.encoding()ว่า หากis_open() == falseหรือoff != 0 && width <= …


2
[[no_unique_address]] และสองค่าสมาชิกประเภทเดียวกัน
ฉันกำลังเล่นกับสิ่งต่อไปนี้[[no_unique_address]]ในc++20 ในตัวอย่างในcppreferenceเรามีประเภทEmptyและประเภทที่ว่างเปล่าZ struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; เห็นได้ชัดว่าขนาดของZต้องมีอย่างน้อย2เพราะประเภทe1และe2เหมือนกัน อย่างไรก็ตามฉันต้องการมีZขนาด1จริงๆ นี้มีฉันคิดสิ่งที่เกี่ยวกับการวางรูปภาพEmptyในชั้นเรียนเสื้อคลุมบางคนที่มีพารามิเตอร์แม่แบบพิเศษที่บังคับใช้ประเภทต่าง ๆและe1e2 template <typename T, int i> struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper<Empty,1> e1; [[no_unique_address]] Wrapper<Empty,2> e2; }; น่าเสียดาย, sizeof(Z1)==2. มีเคล็ดลับในการทำให้ขนาดZ1เป็นที่หนึ่งหรือไม่? ฉันกำลังทดสอบสิ่งนี้ด้วยgcc version 9.2.1และclang …

1
ทำไมฟังก์ชั่น consteval ถึงมีพฤติกรรมที่ไม่ได้กำหนดไว้?
มีคุณสมบัติที่เป็นระเบียบมากของนิพจน์คงที่ใน C ++: การประเมินของพวกเขาไม่สามารถมีพฤติกรรมที่ไม่ได้กำหนด ( 7.7.4.7 ): นิพจน์ e เป็นนิพจน์ค่าคงที่หลักเว้นแต่ว่าการประเมิน e ตามกฎของเครื่องนามธรรม ([intro.execution]) จะประเมินข้อใดข้อหนึ่งต่อไปนี้: ... การดำเนินการที่จะมีพฤติกรรมที่ไม่ได้กำหนดตามที่ระบุไว้ใน [บทนำ] ถึง [cpp] ของเอกสารนี้ [หมายเหตุ: รวมถึงตัวอย่างเช่นจำนวนเต็มล้นลงนาม ([expr.prop]) บางตัวชี้ทางคณิตศาสตร์ ([expr.add]) การหารด้วยศูนย์หรือการเลื่อนบางอย่าง - หมายเหตุท้าย]; การพยายามเก็บค่าของ13!ในข้อผิดพลาดconstexpr intจริงทำให้คอมไพล์คอมไพล์ดี : constexpr int f(int n) { int r = n--; for (; n > 1; --n) r *= n; return …

2
ทำไม std :: swap ที่ทำเครื่องหมายว่า constexpr ก่อน C ++ 20 ไม่
ใน C ++ 20 std::swapกลายเป็นconstexprฟังก์ชัน ฉันรู้ว่าห้องสมุดมาตรฐานล้าหลังภาษาในการทำเครื่องหมายสิ่งต่าง ๆconstexprแต่ในปี 2560 <algorithm>เป็นกลุ่มคนที่ค่อนข้างมากเหมือนกับสิ่งอื่น ๆ แต่ - std::swapไม่ใช่ ฉันจำได้ว่ามีข้อบกพร่องบางอย่างเกี่ยวกับภาษาแปลก ๆ ซึ่งป้องกันการทำเครื่องหมายนั้น แต่ฉันลืมรายละเอียด บางคนสามารถอธิบายสิ่งนี้อย่างกระชับและชัดเจน? แรงจูงใจ: จำเป็นต้องเข้าใจว่าเหตุใดจึงเป็นความคิดที่ไม่ดีที่จะทำเครื่องหมายstd::swap()ฟังก์ชันเหมือนconstexprในรหัส C ++ 11 / C ++ 14

2
std :: chrono :: ปีการจัดเก็บอย่างน้อย 17 บิตจริงหรือ
จากcppreference std::chrono::years (since C++20) duration</*signed integer type of at least 17 bits*/, std::ratio<31556952>> ใช้libc++ดูเหมือนว่าการจัดเก็บการขีดเส้นใต้std::chrono::yearsมีที่shortซึ่งมีการลงนาม16 บิต std::chrono::years( 30797 ) // yields 32767/01/01 std::chrono::years( 30797 ) + 365d // yields -32768/01/01 apparently UB มีการพิมพ์ผิดในcppreferenceหรืออะไรอย่างอื่น? ตัวอย่าง: #include <fmt/format.h> #include <chrono> template <> struct fmt::formatter<std::chrono::year_month_day> { char presentation = 'F'; constexpr auto parse(format_parse_context& ctx) …
14 c++  chrono  c++20  libc++ 

1
if constexpr - เพราะเหตุใดคำสั่งที่ถูกยกเลิกจะถูกตรวจสอบอย่างสมบูรณ์?
ฉันยุ่งกับ c ++ 20 consteval ใน GCC 10 และเขียนรหัสนี้ #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&& pred, Tuple&& t) noexcept { constexpr std::size_t I = std::tuple_size_v<std::decay_t<decltype(t)>> - N; if constexpr (N == 0u) { return std::nullopt; } else { return pred(std::get<I>(t)) …

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