在构造过程中观察变体的状态

Observing the state of a variant during construction

考虑以下代码:

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

A variant might not hold a value if an exception is thrown during a type-changing assignment or emplacement.

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

该标准目前没有为您的问题提供答案,但 LWG 似乎要加入的 direction 是您的代码将具有未定义的行为。