std::variant::valueless_by_exception

来自cppreference.com
< cpp‎ | utility‎ | variant
 
 
 
 
constexpr bool valueless_by_exception() const noexcept;
(C++17 起)

当且仅当 variant 保有值时返回 false

[编辑] 注意

variant 可以在下列情形中变得无值:

  • (保证)在复制赋值中,从临时量移动初始化所含值期间抛出异常
  • (保证)在移动赋值中,移动初始化所含值时抛出异常
  • (可选)在类型更改赋值期间,初始化所含值时抛出异常
  • (可选)在类型更改 emplace 期间,初始化所含值时抛出异常

因为 variant 决不容许分配动态内存,故在这些情况下不可能保留先前的值。

这还应用到非类类型的 variant

struct S {
    operator int() { throw 42; }
};
variant<float, int> v{12.f}; // OK
v.emplace<1>(S()); // v 可能为无值

因异常无值的 variant 被当做在非法态: index 返回 variant_nposgetvisit 抛出 bad_variant_access