# std::monostate

< cpp‎ | utility‎ | variant

定义于头文件 `<variant>` |  |
struct monostate { }; |  | (C++17 起)

有意为行为良好的 std::variant 中空可选项所用的单位类型。具体而言，非可默认构造的 `variant` 可以列 `std::monostate` 为其首个可选项：这使得 `variant` 自身可默认构造。

### 成员函数

(构造函数) (隐式声明) | 平凡隐式默认/复制/移动构造函数 (公开成员函数)
(析构函数) (隐式声明) | 平凡隐式析构函数 (公开成员函数)
operator= (隐式声明) | 平凡隐式复制/移动赋值 (公开成员函数)

### 非成员函数

## std::operator==, !=, <, <=, >, >=, <=>(std::monostate)

constexpr bool operator==(monostate, monostate) noexcept { return true; } |  | (C++17 起)
constexpr bool operator!=(monostate, monostate) noexcept { return false; } constexpr bool operator<(monostate, monostate) noexcept { return false; } constexpr bool operator>(monostate, monostate) noexcept { return false; } constexpr bool operator<=(monostate, monostate) noexcept { return true; } constexpr bool operator>=(monostate, monostate) noexcept { return true; } |  | (C++17 起) (C++20 前)
constexpr std::strong_ordering operator<=>(monostate, monostate) noexcept { return std::strong_ordering::equal; } |  | (C++20 起)

所有 `std::monostate` 实例比较相等。

`<`、 `<=`、 `>`、 `>=` 及 `!=` 运算符分别从 `operator<=>` 与 `operator==` 合成。 | (C++20 起)

### 辅助类

## std::hash<std::monostate>

template <> struct std::hash<monostate>; |  |

为 `std::monostate` 特化 std::hash 算法

### 示例

    #include <variant>
    #include <iostream>

    struct S
    {
        S(int i) : i(i) {}
        int i;
    };

    int main() {

        // 若无 monostate 类型则此声明将失败。
        // 这是因为 S 不可默认构造。

        std::variant<std::monostate, S> var;

        // var.index() 现为 0 ——首个元素
        // std::get<S> 将抛异常！我等需要赋一个值

        var = 12;

        std::cout << std::get<S>(var).i << '\n';
    }

输出：

    12

### 参阅

(构造函数) | 构造 `variant` 对象 (公开成员函数)