std::optional

来自cppreference.com
< cpp‎ | utility
 
 
 
 
定义于头文件 <optional>
template< class T >
class optional;
(C++17 起)

类模板 std::optional 管理一个可选的容纳值,即可以存在也可以不存在的值。

一种常见的 optional 使用情况是一个可能失败的函数的返回值。与其他手段,如 std::pair<T,bool> 相比, optional 良好地处理构造开销高昂的对象,并更加可读,因为它显式表达意图。

任何一个 optional<T> 的实例在给定时间点要么含值,要么不含值

若一个 optional<T> 含值,则保证值作为 optional 对象所用空间的一部分分配,即不会发生动态内存分配。从而 optional 对象模拟一个对象,而非指针,尽管定义了 operator*()operator->() 运算符。

当一个 optional<T> 对象被按语境转换成 bool 时,若对象含值则转换返回 true ,若对象不含值则返回 false

optional 对象在下列条件下含值

  • 对象被以 T 类型值或另一含值optional 初始化/赋值。

对象在下列条件下不含值

  • 对象被默认初始化。
  • 对象被以 std::nullopt_t 类型值或不含值optional 对象初始化/赋值。
  • 调用了成员函数 reset()

无引用的 optional :若以引用类型实例化 optional 则程序非良构。不过,可用 T 类型的 std::reference_wrapperoptional 保有引用。另外,若以(可有 cv 限定的)标签类型 std::nullopt_tstd::in_place_t 实例化 optional 则程序非良构。

模板形参

T - 要为之管理状态的值的类型。该类型必须满足可析构 (Destructible) 的要求。

成员类型

 
成员类型 定义
value_type T

成员函数

构造optional对象
(公开成员函数)
销毁容纳的值,若存在
(公开成员函数)
对内容赋值
(公开成员函数)
观察器
访问所含值
(公开成员函数)
检查对象是否含值
(公开成员函数)
返回所含值
(公开成员函数)
若所含值可用则返回它,否则返回另一个值
(公开成员函数)
修改器
交换内容
(公开成员函数)
销毁任何所含值
(公开成员函数)
原位构造所含值
(公开成员函数)

非成员函数

比较 optional 对象
(函数模板)
创建一个 optional 对象
(函数模板)
特化 std::swap 算法
(函数)

辅助类

特化 std::hash 算法
(类模板特化)
(C++17)
带未初始化状态的 optional 类型的指示器
(类)
指示进行了到不含值的 optional 的有检查访问的异常
(类)

辅助对象

(C++17)
nullopt_t 类型对象
(常量)
原位构造标签
(类模板)

推导指引

示例

#include <string>
#include <functional>
#include <iostream>
#include <optional>
 
// optional 可用作可能失败的工厂的返回类型
std::optional<std::string> create(bool b) {
    if(b)
        return "Godzilla";
    else
        return {};
}
 
// 能用 std::nullopt 创建任何(空的) std::optional
auto create2(bool b) {
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
 
// std::reference_wrapper 可用于返回引用
auto create_ref(bool b) {
    static std::string value = "Godzilla";
    return b ? std::optional<std::reference_wrapper<std::string>>{value}
             : std::nullopt;
}
 
int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << '\n';
 
    // 返回 optional 的工厂函数可用作 while 和 if 的条件
    if (auto str = create2(true)) {
        std::cout << "create2(true) returned " << *str << '\n';
    }
 
    if (auto str = create_ref(true)) {
        // 用 get() 访问 reference_wrapper 的值
        std::cout << "create_ref(true) returned " << str->get() << '\n';
        str->get() = "Mothra";
        std::cout << "modifying it changed it to " << str->get() << '\n';
    }
}

输出:

create(false) returned empty
create2(true) returned Godzilla
create_ref(true) returned Godzilla
modifying it changed it to Mothra

参阅

(C++17 起)
类型安全的可辨识联合体
(类模板)
(C++17 起)
可保有任何可复制构造 (CopyConstructible) 类型的实例的对象。
(类)