Длинное название: Почему спецификация std:variant
s operator=(T&& t)
не зависит от спецификации noexcept деструктора внутренних типов?
Я вижу по cppreference , что
template <class T> variant& operator=(T&& t) noexcept(/* see below */);
is
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
Это не кажется правильным.Я что-то упустил?