std::monostate
来自cppreference.com
在标头 <variant> 定义 | ||
在标头 <utility> 定义 | (C++26 起) | |
struct monostate {}; | (C++17 起) | |
有意作为 std::variant 中的行为良好的空可选项的单位类型。具体而言,非可默认构造的变体类型可以把 std::monostate
列为其首个可选项:这使得此变体自身可默认构造。
目录 |
[编辑]成员函数
(构造函数) (隐式声明) | 平凡隐式默认/复制/移动构造函数 (公开成员函数) |
(析构函数) (隐式声明) | 平凡隐式析构函数 (公开成员函数) |
operator= (隐式声明) | 平凡隐式复制/移动赋值 (公开成员函数) |
[编辑]非成员函数
std::operator==, !=, <, <=, >, >=, <=>(std::monostate)
constexprbool operator==( monostate, monostate )noexcept{returntrue;} | (1) | (C++17 起) |
(2) | ||
constexprbool operator!=( monostate, monostate )noexcept{returnfalse;} constexprbool operator<( monostate, monostate )noexcept{returnfalse;} | (C++17 起) (C++20 前) | |
constexprstd::strong_ordering operator<=>( monostate, monostate )noexcept { | (C++20 起) | |
所有 std::monostate
实例比较相等。
| (C++20 起) |
[编辑]辅助类
std::hash<std::monostate>
template<> structstd::hash<monostate>; | (C++17 起) | |
为 std::monostate
特化 std::hash 算法。
[编辑]示例
运行此代码
#include <cassert>#include <iostream>#include <variant> struct S { S(int i): i(i){}int i;}; int main(){// 若无 monostate 类型则此声明将失败。// 这是因为 S 不可默认构造。std::variant<std::monostate, S> var;assert(var.index()==0); try{std::get<S>(var);// 将抛异常!我们需要先赋一个值}catch(conststd::bad_variant_access& e){std::cout<< e.what()<<'\n';} var =42;std::cout<<"std::get: "<<std::get<S>(var).i<<'\n'<<"std::hash: "<<std::hex<<std::showbase<<std::hash<std::monostate>{}(std::monostate{})<<'\n';}
可能的输出:
std::get: wrong index for variant std::get: 42 std::hash: 0xffffffffffffe19f
[编辑]参阅
构造 variant 对象 (公开成员函数) |