長いタイトル:の noexcept 指定が内部型のデストラクタの noexcept 指定に依存しないのはstd:variant
なぜですか?operator=(T&& t)
私はcppreferenceでそれを見ることができます
template <class T> variant& operator=(T&& t) noexcept(/* see below */);
は
noexcept(std::is_nothrow_assignable_v<T_j&, T> &&
std::is_nothrow_constructible_v<T_j, T>)
したがって、これはコンパイルされます:
struct FooThrow {
~FooThrow() noexcept(false) {throw;}
};
static_assert(std::is_nothrow_assignable_v<std::variant<FooThrow, int>, int>);
しかし、次FooThrow
のデストラクタを呼び出しnoexcept(false)
ます。
std::variant<FooThrow, int> x;
x = 3; // throws
正しくないようです。何か不足していますか?