3

長いタイトル:の 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

正しくないようです。何か不足していますか?

4

1 に答える 1