タグ付けされた質問 「variant」


2
GCC9はstd :: variantの値のない状態を回避できますか?
私は最近、std::visitコンパイラ間の最適化の素晴らしい比較につながるRedditディスカッションをフォローしました。私は次のことに気づきました: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 valueless_hack<First>::tag const&) {} } 主張によると、これによりすべてのバリアントが無価値になり、ドキュメントを読むと次のようになります。 まず、現在含まれている値(存在する場合)を破棄します。次にT_I、引数を使用してtypeの値を作成する場合と同様に、含まれている値を直接初期化します。std::forward<Args>(args)....例外がスローされた場合、*thisvalueless_by_exceptionになることがあります。 わからないこと:なぜ「かもしれない」と記載されているのですか?操作全体がスローされた場合、古い状態を維持することは合法ですか?これはGCCが行うことなので、 // For suitably-small, trivially copyable types we …

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, from main.cpp:1: /usr/include/c++/8/utility:216:5: …
10 c++  c++17  variant 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.