在线文档教程
C++
应用 | Utilities

std::optional::optional

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.

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.

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

#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:

1 1 abc AAA

See also

make_optional (C++17)creates an optional object (function template)

© cppreference.com

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

http://en.cppreference.com/w/cpp/utility/optional/optional