std::variant<Types...>::~variant
ja.cppreference.net より
~variant();
|
(C++17 以上) (C++20 以降 constexpr) |
|
valueless_by_exception() が true である場合、何もしない。そうでなければ、現在保持されているオブジェクトを破棄する。
すべての std::is_trivially_destructible_v<T_i> について true が T_i 内のすべての Types... に対して真である場合、このデストラクタはトリビアルである。
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__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 に変更 |