首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::optional::optional

constexpr optional(); constexpr optional( std::nullopt_t );

(1)

(since C++17)

constexpr optional( const optional& other );

(2)

(since C++17)

constexpr optional( optional&& other );

(3)

(since C++17)

template < class U > /* EXPLICIT */ optional( const optional<U>& other );

(4)

(since C++17)

template < class U > /* EXPLICIT */ optional( optional<U>&& other );

(5)

(since C++17)

template< class... Args > constexpr explicit optional( std::in_place_t, Args&&... args );

(6)

(since C++17)

template< class U, class... Args > constexpr explicit optional( std::in_place_t, std::initializer_list<U> ilist, Args&&... args );

(7)

(since C++17)

template < class U = value_type > /* EXPLICIT */ constexpr optional( U&& value );

(8)

(since C++17)

Constructs a new optional object.

1) Constructs the object that does not contain a value.

2) Copy constructor: If other contains a value, initializes the contained value as if direct-initializing (but not direct-list-initializing) an object of type T with the expression *other. If other does not contain a value, constructs an object that does not contain a value. This constructor is defined as deleted if std::is_copy_constructible_v<T> is false. It is a constexpr constructor if std::is_trivially_copy_constructible_v<T> is true.

3) Move constructor: If other contains a value, initializes the contained value as if direct-initializing (but not direct-list-initializing) an object of type T with the expression std::move(*other) and does not make other empty: a moved-from optional still contains a value, but the value itself is moved from. If other does not contain a value, constructs an object that does not contain a value. This constructor does not participate in overload resolution unless std::is_move_constructible_v<T> is true. It is a constexpr constructor if std::is_trivially_move_constructible_v<T> is true.

4) Converting copy constructor: If other doesn't contain a value, constructs an optional object that does not contain a value. Otherwise, constructs an optional object that contains a value, initialized as if direct-initializing (but not direct-list-initializing) an object of type T with the expression *other. This constructor does not participate in overload resolution unless the following conditions are met:

  • std::is_constructible_v<T, const U&> is true.
  • T is not constructible or convertible from any expression of type (possibly const) std::optional<U>, i.e., the following 8 type traits are all false:
    • std::is_constructible_v<T, std::optional<U>&>
    • std::is_constructible_v<T, const std::optional<U>&>
    • std::is_constructible_v<T, std::optional<U>&&>
    • std::is_constructible_v<T, const std::optional<U>&&>
    • std::is_convertible_v<std::optional<U>&, T>
    • std::is_convertible_v<const std::optional<U>&, T>
    • std::is_convertible_v<std::optional<U>&&, T>
    • std::is_convertible_v<const std::optional<U>&&, T>

This constructor is explicit if and only if std::is_convertible_v<const U&, T> is false.

5) Converting move constructor: If other doesn't contain a value, constructs an optional object that does not contain a value. Otherwise, constructs an optional object that contains a value, initialized as if direct-initializing (but not direct-list-initializing) an object of type T with the expression std::move(*other). This constructor does not participate in overload resolution unless the following conditions are met:

  • std::is_constructible_v<T, U&&> is true.
  • T is not constructible or convertible from any expression of type (possibly const) std::optional<U>, i.e., the following 8 type traits are all false:
    • std::is_constructible_v<T, std::optional<U>&>
    • std::is_constructible_v<T, const std::optional<U>&>
    • std::is_constructible_v<T, std::optional<U>&&>
    • std::is_constructible_v<T, const std::optional<U>&&>
    • std::is_convertible_v<std::optional<U>&, T>
    • std::is_convertible_v<const std::optional<U>&, T>
    • std::is_convertible_v<std::optional<U>&&, T>
    • std::is_convertible_v<const std::optional<U>&&, T>

This constructor is explicit if and only if std::is_convertible_v<U&&, T> is false.

6) Constructs an optional object that contains a value, initialized as if direct-initializing (but not direct-list-initializing) an object of type T from the arguments std::forward<Args>(args).... If the selected constructor of T is a constexpr constructor, this constructor is a constexpr constructor. The function does not participate in the overload resolution unless std::is_constructible_v<T, Args...> is true

7) Constructs an optional object that contains a value, initialized as if direct-initializing (but not direct-list-initializing) an object of type T from the arguments ilist, std::forward<Args>(args).... If the selected constructor of T is a constexpr constructor, this constructor is a constexpr constructor. The function does not participate in the overload resolution unless std::is_constructible_v<T, std::initializer_list<U>&, Args&&...> is true

8) Constructs an optional object that contains a value, initialized as if direct-initializing (but not direct-list-initializing) an object of type T (where T = value_type) with the expression std::forward<U>(value). If the selected constructor of T is a constexpr constructor, this constructor is a constexpr constructor. This constructor does not participate in overload resolution unless std::is_constructible_v<T, U&&> is true and std::decay_t<U> is neither std::in_place_t nor std::optional<T>. This constructor is explicit if and only if std::is_convertible_v<U&&, T> is false.

Parameters

other

-

another optional object whose contained value to copy

value

-

value to initialize the contained value with

args...

-

arguments to initialize the contained value with

ilist

-

initializer list to initialize the contained value with

Exceptions

1)

noexcept specification:

noexcept

2) Throws any exception thrown by the constructor of T.

3) Throws any exception thrown by the constructor of T. Has the following noexcept declaration:

noexcept specification:

noexcept(std::is_nothrow_move_constructible<T>::value)

.

4-8) Throws any exception thrown by the constructor of T.

Example

代码语言:javascript
复制
#include <optional>
#include <iostream>
#include <string>
int main()
{
    std::optional<int> o1, // empty
                       o2 = 1, // init from rvalue
                       o3 = o2; // copy-constructor
 
    // calls string( initializer_list<CharT> ) constructor
    std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'});
 
    // calls string( size_type count, CharT ch ) constructor
    std::optional<std::string> o5(std::in_place, 3, 'A');
 
    std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5  << '\n';
}

Output:

代码语言:javascript
复制
1 1 abc AAA

See also

make_optional (C++17)

creates an optional object (function template)

代码语言:txt
复制
 © cppreference.com

Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.

扫码关注腾讯云开发者

领取腾讯云代金券