3

考虑以下代码:

#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):

如果在类型更改分配或安置期间引发异常,则变体可能不保存值。

在这里,我显然不是那种情况。

4

1 回答 1

3

该标准目前没有为您的问题提供答案,但LWG 似乎正在发展的方向是您的代码将具有未定义的行为。

于 2021-09-04T00:14:40.777 回答