std::variant<Types...>::valueless_by_exception
来自cppreference.com
constexpr bool valueless_by_exception() const noexcept; |
(C++17 起) | |
当且仅当 variant
保有值时返回 false
。
注解
variant
可以在下列情形中变得无值:
- (保证)在移动赋值中,移动初始化所含值时抛出异常
- (可选)在复制赋值中,复制初始化所含值时抛出异常
- (可选)在类型更改赋值期间,初始化所含值时抛出异常
- (可选)在类型更改
emplace
期间,初始化所含值时抛出异常
因为 variant
决不容许分配动态内存,故在这些情况下不可能保留先前的值。
这还应用到非类类型的 variant
:
struct S { operator int() { throw 42; } }; std::variant<float, int> v{12.f}; // OK v.emplace<1>(S()); // v 可能为无值
因异常无值的 variant
被当做在非法态: index
返回 variant_npos
, get
与 visit
抛出 bad_variant_access
。
示例
运行此代码
#include <cassert> #include <iostream> #include <stdexcept> #include <string> #include <variant> struct Demo { Demo(int) {} Demo(const Demo&) { throw std::domain_error("copy ctor"); } Demo& operator= (const Demo&) = default; }; int main() { std::variant<std::string, Demo> var{"str"}; assert(var.index() == 0); assert(std::get<0>(var) == "str"); assert(var.valueless_by_exception() == false); try { var = Demo{666}; } catch (const std::domain_error& ex) { std::cout << "1) Exception: " << ex.what() << '\n'; } assert(var.index() == std::variant_npos); assert(var.valueless_by_exception() == true); // 现在 var “无值”,此为 var 的初始化过程中引发的异常导致的非法状态。 try { std::get<1>(var); } catch (const std::bad_variant_access& ex) { std::cout << "2) Exception: " << ex.what() << '\n'; } var = "str2"; assert(var.index() == 0); assert(std::get<0>(var) == "str2"); assert(var.valueless_by_exception() == false); }
可能的输出:
1) Exception: copy ctor 2) Exception: std::get: variant is valueless
参阅
(C++17) |
以给定索引或类型(若类型唯一)读取 variant 的值,错误时抛出异常 (函数模板) |
返回 variant 所保有可选项的零基下标 (公开成员函数) | |
(C++17) |
非法地访问 variant 的值时抛出的异常 (类) |