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


2
GCC9 หลีกเลี่ยงสถานะไร้ค่าของ std :: variant ที่อนุญาตหรือไม่
ฉันเพิ่งติดตามการสนทนา Reddit ซึ่งนำไปสู่การเปรียบเทียบที่ดีของstd::visitการเพิ่มประสิทธิภาพในคอมไพเลอร์ ฉันสังเกตเห็นสิ่งต่อไปนี้: https://godbolt.org/z/D2Q5ED ทั้ง GCC9 และ Clang9 (ฉันเดาว่าพวกเขาแบ่งปัน stdlib เดียวกัน) ไม่ได้สร้างรหัสสำหรับการตรวจสอบและการโยนข้อยกเว้นที่ไม่มีค่าเมื่อทุกประเภทเป็นไปตามเงื่อนไขบางประการ สิ่งนี้นำไปสู่วิธีที่ดีกว่า codegen ดังนั้นฉันยกปัญหากับ MSVC STL และถูกนำเสนอด้วยรหัสนี้: template <class T> struct valueless_hack { struct tag {}; operator T() const { throw tag{}; } }; template<class First, class... Rest> void make_valueless(std::variant<First, Rest...>& v) { try { v.emplace<0>(valueless_hack<First>()); } catch(typename …

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