长标题:为什么std:variant
'soperator=(T&& t)
的 noexcept 规范不依赖于内部类型的析构函数的 noexcept 规范?
我可以在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
好像不太对。我错过了什么吗?