Namespaces
Variants

std::experimental::optional<T>:: optional

From cppreference.net
constexpr optional ( ) noexcept ;
constexpr optional ( std:: experimental :: nullopt_t ) noexcept ;
(1) (库基础技术规范)
optional ( const optional & other ) ;
(2) (库基础技术规范)
optional ( optional && other ) noexcept ( /* 见下文 */ ) ;
(3) (库基础技术规范)
constexpr optional ( const T & value ) ;
(4) (库基础技术规范)
constexpr optional ( T && value ) ;
(5) (库基础技术规范)
template < class ... Args >
constexpr explicit optional ( std:: experimental :: in_place_t , Args && ... args ) ;
(6) (库基础技术规范)
template < class U, class ... Args >

constexpr explicit optional ( std:: experimental :: in_place_t ,
std:: initializer_list < U > ilist,

Args && ... args ) ;
(7) (库基础技术规范)

构造一个新的 optional 对象。

1) 构造一个 不包含值 的对象。
2) 复制构造函数:若 other 包含值,则如同以表达式 * other 直接初始化 (但不进行直接列表初始化)类型为 T 的对象一般初始化所含值。若 other 不包含值,则构造一个 不包含值 的对象。
3) 移动构造函数:若 other 包含值,则如同以表达式 std :: move ( * other ) 直接初始化 (但非直接列表初始化)类型为 T 的对象般初始化所含值,且 不会 使 other 变为空:被移动的 optional 仍 包含值 ,但该值本身已被移走。若 other 不包含值,则构造一个 不包含值 的对象。
4) 构造一个包含值的 optional 对象,其初始化方式如同使用表达式 value 对类型 T 对象进行 直接初始化 (但不包括直接列表初始化)。如果通过直接初始化选择的 T 的构造函数是 constexpr 的,则该构造函数也为 constexpr
5) 构造一个包含值的 optional 对象,其初始化方式如同使用表达式 std :: move ( value ) 对类型 T 对象进行直接初始化(但不包括直接列表初始化)。若通过直接初始化选择的 T 的构造函数为 constexpr ,则此构造函数亦为 constexpr
6) 构造一个包含值的 optional 对象,其初始化方式如同使用参数 std:: forward < Args > ( args ) ... 对类型 T 对象进行 直接初始化 (但不包括直接列表初始化)。
7) 构造一个包含值的 optional 对象,其初始化方式类似于使用参数 ilist, std:: forward < Args > ( args ) ... 对类型 T 对象进行 直接初始化 (但不包括直接列表初始化)。若 std:: is_constructible < T, std:: initializer_list < U > & , Args && ... > :: value ! = true ,则该函数不参与重载决议。

目录

参数

other - 用于复制其包含值的另一个 optional 对象
value - 用于初始化包含值的值
args... - 用于初始化包含值的参数
ilist - 用于初始化包含值的初始化列表
类型要求
-
T 必须满足 CopyConstructible 要求才能使用重载 (2,4)
-
T 必须满足 MoveConstructible 要求才能使用重载 (3,5)

异常

2) 抛出 T 的构造函数抛出的任何异常。
3) 抛出 T 的构造函数抛出的任何异常。具有以下 noexcept 声明:
noexcept 规范:
noexcept ( std:: is_nothrow_move_constructible < T > :: value )
4-7) 抛出 T 构造函数抛出的任何异常。

示例

#include <experimental/optional>
#include <iostream>
#include <string>
int main()
{
    std::experimental::optional<int> o1,      // 空值
                                     o2 = 1,  // 从右值初始化
                                     o3 = o2; // 拷贝构造
    std::experimental::optional<std::string> o4(std::experimental::in_place,
                                                {'a', 'b', 'c'});
    std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << '\n';
}

输出:

1 1 abc

另请参阅

创建 optional 对象
(函数模板)