命名空间
变体
操作

std::optional

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

类模板 std::optional 管理一个可选的包含值,即一个可能存在也可能不存在的值。

optional 的一个常见用例是可能失败的函数的返回值。 与其他方法(例如 std::pair<T, bool>)相反,optional 可以很好地处理构造昂贵的对象,并且更具可读性,因为意图被明确表达。

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

如果 optional 包含一个值,则保证该值嵌套在 optional 对象内。 因此,即使定义了 operator*()operator->()optional 对象也模拟对象,而不是指针。

当类型为 optional<T> 的对象在语境上转换为 bool 时,如果对象包含值,则转换返回 true,如果对象不包含值,则返回 false

在以下条件下,optional 对象包含一个值

  • 对象使用 T 类型的值或另一个包含值的 optional 初始化/赋值。

在以下条件下,对象不包含值

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

optional 对象是一个 view,如果它包含一个值,则包含一个元素;如果它不包含一个值,则包含零个元素。 包含元素的生命周期绑定到该对象。

(自 C++26)

没有 optional 引用、函数、数组或(可能带有 cv 限定的)void;如果程序使用此类类型实例化 optional,则程序是非良构的。 此外,如果程序使用(可能带有 cv 限定的)标签类型 std::nullopt_tstd::in_place_t 实例化 optional,则程序是非良构的。

内容

[编辑] 模板形参

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

[编辑] 嵌套类型

类型 定义
value_type T
iterator (自 C++26) 实现定义的 LegacyRandomAccessIteratorConstexprIteratorcontiguous_iterator,其 value_typereference 分别为 std::remove_cv_t<T>T&
const_iterator (自 C++26) 实现定义的 LegacyRandomAccessIteratorConstexprIteratorcontiguous_iterator,其 value_typereference 分别为 std::remove_cv_t<T>const T&

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

[编辑] 数据成员

T* val 指向包含对象的指针(如果存在)
仅用于说明的成员对象*

[编辑] 成员函数

构造 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
(类) [编辑]
指示对不包含值的 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范围格式化支持

[编辑] 推导指引

[编辑] 注解

特性测试 标准 特性
__cpp_lib_optional 201606L (C++17) std::optional
202106L (C++23)
(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++ 标准。

DR 应用于 已发布行为 正确行为
LWG 4141 C++17 存储的要求
分配令人困惑
包含的对象必须
嵌套在 optional 对象内

[编辑] 参见

(C++17)
类型安全的区分联合
(类模板) [编辑]
(C++17)
持有任何 CopyConstructible 类型实例的对象
(类) [编辑]
(C++23)
一个包含预期值或错误值的包装器
(类模板) [编辑]
一个 view,包含指定值的单个元素
(类模板) (自定义点对象)[编辑]
一个没有元素的空 view
(类模板) (变量模板)[编辑]