命名空间
变体
操作

std::optional

来自 cppreference.com
< cpp‎ | utility
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库特性测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三向比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
optional
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
定义在头文件 <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 对象是一个view,如果包含一个值,则包含一个元素;否则,如果不包含一个值,则包含零个元素。包含元素的生存期绑定到该对象。

(自 C++26 起)

没有可选引用、函数、数组或cv void;如果程序使用这种类型实例化 optional,则该程序格式错误。此外,如果程序使用(可能被 cv 限定的)标签类型 std::nullopt_tstd::in_place_t 实例化 optional,则该程序格式错误。

内容

[编辑] 模板参数

T - 要管理初始化状态的值的类型。该类型必须满足 可销毁 的要求(特别是,不允许使用数组和引用类型)。

[编辑] 成员类型

成员名称 定义
value_type T
iterator (自 C++26 起) 实现定义的 传统随机访问迭代器常量表达式迭代器contiguous_iterator,其 value_typereference 分别为 std::remove_cv_t<T>T&
const_iterator (自 C++26 起) 实现定义的 传统随机访问迭代器常量表达式迭代器contiguous_iterator,其 value_typereference 分别为 std::remove_cv_t<T>const T&

容器 的迭代器类型的所有要求也适用于 optionaliterator 类型。

[编辑] 成员函数

构造 optional 对象
(公共成员函数) [编辑]
如果存在,则销毁所包含的值
(公共成员函数) [编辑]
赋值内容
(公共成员函数) [编辑]
迭代器
(C++26)
返回指向开头的迭代器
(公共成员函数) [编辑]
(C++26)
返回指向末尾的迭代器
(公共成员函数) [编辑]
观察者
访问所包含的值
(公共成员函数) [编辑]
检查对象是否包含值
(公共成员函数) [编辑]
返回所包含的值
(公共成员函数) [编辑]
如果可用,返回所包含的值,否则返回另一个值
(公共成员函数) [编辑]
单子操作
(C++23)
如果存在,返回给定函数对所包含值的调用结果,否则返回一个空的 optional
(公共成员函数) [编辑]
(C++23)
如果存在,返回一个包含已转换的所包含值的 optional,否则返回一个空的 optional
(公共成员函数) [编辑]
(C++23)
如果包含值,返回 optional 本身,否则返回给定函数的结果
(公共成员函数) [编辑]
修饰符
交换内容
(公共成员函数) [编辑]
销毁任何包含的值
(公共成员函数) [编辑]
就地构造所包含的值
(公共成员函数) [编辑]

[编辑] 非成员函数

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
比较 optional 对象
(函数模板) [编辑]
创建一个 optional 对象
(函数模板) [编辑]
专门化 std::swap 算法
(函数模板) [编辑]

[编辑] 辅助类

std::optional 的哈希支持
(类模板专门化) [编辑]
(C++17)
不包含值的 std::optional 的指示器
(类) [编辑]
指示对不包含值的可选值进行检查访问的异常
(类) [编辑]

[编辑] 辅助程序

(C++17)
nullopt_t 类型的对象
(常量) [编辑]
就地构造标记
(标记)[编辑]

[编辑] 辅助专门化

template< class T >
constexpr bool ranges::enable_view<std::optional<T>> = true;
(自 C++26 起)

这种 ranges::enable_view 的专门化使 optional 满足 view 的要求。

template< class T >
constexpr auto format_kind<std::optional<T>> = range_format::disabled;
(自 C++26 起)

这种 format_kind 的专门化禁用了 optional范围格式化支持

[编辑] 推导指南

[编辑] 注释

功能测试 Std 功能
__cpp_lib_optional 201606L (C++17) std::optional
202106L (C++20)
(DR20)
完全 constexpr
202110L (C++23) 单子操作
__cpp_lib_optional_range_support 202406L (C++26) std::optional 的范围支持

[编辑] 示例

#include <iostream>
#include <optional>
#include <string>
 
// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b)
{
    if (b)
        return "Godzilla";
    return {};
}
 
// std::nullopt can be used to create any (empty) std::optional
auto create2(bool b)
{
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
 
int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << '\n';
 
    // optional-returning factory functions are usable as conditions of while and if
    if (auto str = create2(true))
        std::cout << "create2(true) returned " << *str << '\n';
}

输出

create(false) returned empty
create2(true) returned Godzilla

[编辑] 另请参阅

(C++17)
类型安全的区分联合
(类模板) [编辑]
(C++17)
保存任何 CopyConstructible 类型的实例的对象
(类) [编辑]
包含指定值的单个元素的 view
(类模板) (自定义点对象)[编辑]
一个没有元素的空 view
(类模板) (变量模板)[编辑]