std::optional<T>:: optional
|
constexpr
optional
(
)
noexcept
;
|
(1) | (C++17以降) |
|
constexpr
optional
(
std::
nullopt_t
)
noexcept
;
|
(2) | (C++17以降) |
|
constexpr
optional
(
const
optional
&
other
)
;
|
(3) | (C++17以降) |
|
constexpr
optional
(
optional
&&
other
)
noexcept
(
/* 下記参照 */
)
;
|
(4) | (C++17以降) |
|
template
<
class
U
>
optional ( const optional < U > & other ) ; |
(5) |
(C++17以降)
(C++20以降 constexpr) (条件付き explicit) |
|
template
<
class
U
>
optional ( optional < U > && other ) ; |
(6) |
(C++17以降)
(C++20以降 constexpr) (条件付き explicit) |
|
template
<
class
...
Args
>
constexpr explicit optional ( std:: in_place_t , Args && ... args ) ; |
(7) | (C++17以降) |
|
template
<
class
U,
class
...
Args
>
constexpr
explicit
optional
(
std::
in_place_t
,
|
(8) | (C++17以降) |
|
template
<
class
U
=
std::
remove_cv_t
<
T
>
>
constexpr optional ( U && value ) ; |
(9) |
(C++17以降)
(条件付き explicit) |
新しい
optional
オブジェクトを構築します。
目次 |
パラメータ
| other | - |
別の
optional
オブジェクト。その含まれる値がコピーされます
|
| value | - | 含まれる値を初期化するための値 |
| args... | - | 含まれる値を初期化するための引数 |
| ilist | - | 含まれる値を初期化するための初期化子リスト |
効果
| オーバーロード | 初期化方法 | 含まれる値の初期化子 |
has_value()
構築後の状態
|
|---|---|---|---|
| ( 1 ) | N/A | - | false |
| ( 2 ) | |||
| ( 3 ) | 直接初期化 (非リスト) | * other |
other.
has_value
(
)
|
| ( 4 ) | std :: move ( * other ) | ||
| ( 5 ) | * other | ||
| ( 6 ) | std :: move ( * other ) | ||
| ( 7 ) | std:: forward < Args > ( args ) ... | true | |
| ( 8 ) | ilist, std:: forward < Args > ( args ) ... | ||
| ( 9 ) | std:: forward < U > ( value ) |
制約条件と補足情報
- std:: is_constructible_v < T, const U & > が true であること。
-
Tが(CV修飾された可能性のある) bool でない場合、以下の8つの値が全て false [1] であること:- 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 >
- std:: is_constructible_v < T, U > が true であること。
-
Tが(CV修飾された可能性のある) bool でない場合、以下の8つの値が全て false [1] であること:- 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 >
T
のコンストラクタが
constexpr
コンストラクタである場合、このコンストラクタもまた
constexpr
コンストラクタとなります。
T
のコンストラクタが
constexpr
コンストラクタである場合、このコンストラクタもまた
constexpr
コンストラクタとなります。
- std:: is_constructible_v < T, U > が true であること。
- std:: decay_t < U > (C++20まで) std:: remove_cvref_t < U > (C++20以降) が std::in_place_t でも std:: optional < T > でもないこと。
-
Tが(CV修飾された可能性のある) bool である場合、 std:: decay_t < U > (C++20まで) std:: remove_cvref_t < U > (C++20以降) がstd::optionalの特殊化ではないこと。
T
のコンストラクタが
constexpr
コンストラクタである場合、このコンストラクタもまた
constexpr
コンストラクタとなります。
-
↑
1.0
1.1
言い換えれば、
Tは(const修飾された可能性のある)型 std:: optional < U > の任意の式から構築可能でも変換可能でもない。
例外
T
のコンストラクタによってスローされるあらゆる例外をスローします。
T
のコンストラクタが送出するあらゆる例外を送出する。以下の
T
のコンストラクタによってスローされるあらゆる例外をスローします。
推論ガイド
注記
LWG issue 3836
が解決される以前は、
std::
optional
<
bool
>
を
std::
optional
<
U
>
から構築する際、
U
が
bool
でない場合、オーバーロード
(
5,6
)
ではなくオーバーロード
(
9
)
が選択されていました。これは、オーバーロード
(
5,6
)
が
T
(この場合は
bool
)が
std::
optional
<
U
>
から構築または変換可能な場合にオーバーロード解決に参加しなかったためです。しかし、
std::optional::operator bool
によってあらゆる
U
に対して変換が可能となっていました。
結果として、構築された std:: optional < bool > は常に値を保持します。その値は、提供された std:: optional < U > オブジェクトが値を保持しているかどうかによって決定され、保持されている値から直接初期化された bool 値そのものではありません:
std::optional<bool> op_false(false); std::optional<int> op_zero(0); std::optional<int> from_bool(op_false); // OK: 0を含む (falseから初期化) std::optional<bool> from_int(op_zero); // 欠陥 (LWG 3836): trueを含む - // op_zeroが値を含んでいるため、 // その値からboolを初期化するとfalseになる場合でも
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_optional
|
202106L
|
(C++20)
(DR20) |
完全な constexpr ( 5,6 ) |
例
#include <iostream> #include <optional> #include <string> int main() { std::optional<int> o1, // 空 o2 = 1, // 右辺値からの初期化 o3 = o2; // コピーコンストラクタ // std::string( initializer_list<CharT> ) コンストラクタを呼び出し std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'}); // std::string( size_type count, CharT ch ) コンストラクタを呼び出し std::optional<std::string> o5(std::in_place, 3, 'A'); // 型推導ガイドを使用してstd::stringからムーブ構築 std::optional o6(std::string{"deduction"}); std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5 << ' ' << *o6 << '\n'; }
出力:
1 1 abc AAA deduction
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3836 | C++17 |
std::
optional
<
bool
>
を
std::
optional
<
U
>
から構築する際、
オーバーロード解決が ( 9 ) を選択する(
U
が
bool
でない場合)
|
この場合、常に変換コピー/ムーブ
コンストラクタを選択する |
| LWG 3886 | C++17 |
オーバーロード
(
9
)
のデフォルトテンプレート引数が
T
だった
|
std:: remove_cv_t < T > に変更 |
| P0602R4 | C++17 |
コピー/ムーブコンストラクタが、基になるコンストラクタが
自明であっても自明でない可能性があった |
自明性の伝播が
要求されるようになった |
| P2231R1 | C++20 |
他の
std::optional
からのオーバーロード
(
5,6
)
が
constexpr
ではなかった
|
constexpr 化された |
関連項目
|
(C++17)
|
optional
オブジェクトを作成する
(関数テンプレート) |