std::variant<Types...>::~variant
From cppreference.com
~variant(); |
(C++17以降) (C++20 以降 constexpr) |
|
valueless_by_exception() が true の場合、何も行いません。それ以外の場合は、現在保持されているオブジェクトを破棄します。
Types... のすべての T_i に対して std::is_trivially_destructible_v<T_i> が true の場合、このデストラクタは自明です。
[編集] 注記
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_variant |
202106L |
(C++20) (DR) |
完全な constexpr std::variant |
[編集] 例
このコードを実行
#include <cstdio> #include <variant> int main() { struct X { ~X() { puts("X::~X();"); } }; struct Y { ~Y() { puts("Y::~Y();"); } }; { puts("entering block #1"); std::variant<X,Y> var; puts("leaving block #1"); } { puts("entering block #2"); std::variant<X,Y> var{ std::in_place_index_t<1>{} }; // constructs var(Y) puts("leaving block #2"); } }
出力
entering block #1 leaving block #1 X::~X(); entering block #2 leaving block #2 Y::~Y();
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2231R1 | C++20 | デストラクタは constexpr ではありませんでしたが、C++20 では自明でないデストラクタも constexpr にできます。 | constexprではありませんでした。 |