考虑以下代码:
#include <variant>
#include <cassert>
struct foo {
foo() noexcept;
foo(const foo&) noexcept = default;
foo(foo&&) noexcept = default;
foo& operator=(const foo&) noexcept = default;
foo& operator=(foo&&) noexcept = default;
};
std::variant<std::monostate, foo> var;
foo::foo() noexcept {
assert(!var.valueless_by_exception());
};
int main() {
var.emplace<foo>();
}
使用 libstdc++(来自 GCC 11),这可以工作,但使用 libc++(来自 LLVM 12)和 MSVC,断言失败。
哪个标准库实现了正确的行为?在任何时候都不会抛出任何异常,而且我的类型完全是 noexcept,所以我希望“valueless_from_exception”永远不会是真的。
引用标准(https://timsong-cpp.github.io/cppwp/n4861/variant#status):
如果在类型更改分配或安置期间引发异常,则变体可能不保存值。
在这里,我显然不是那种情况。