# std::variant<Types...>::valueless_by_exception

< cpp‎ | utility‎ | variant

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

### 参阅

std::get(std::variant) (C++17) | 以给定索引或类型（若类型唯一）读取 `variant` 的值，错误时抛出异常 (函数模板)
index | 返回 `variant` 所保有可选项的零基下标 (公开成员函数)
bad_variant_access (C++17) | 非法地访问 `variant` 的值时抛出的异常 (类)