std::optional
| ヘッダ <optional> で定義
|
||
template< class T > class optional; |
(C++17以上) | |
クラステンプレート std::optional はオプショナルな値、つまり存在するかもしれないし存在しないかもしれない値を格納します。
optional の一般的な用途は、失敗するかもしれない関数の戻り値です。 他の手法、例えば std::pair<T,bool> に比べると、 optional は構築コストの高いオブジェクトを上手く扱うことができ、可読性が高く、意図を明示的に表現できます。
任意の optional<T> のインスタンスは任意の時点において値を格納しているまたは値を格納していないのいずれかです。
optional<T> が値を格納している場合、その値は optional オブジェクトのフットプリントの一部として確保されることが保証されています。 つまり、動的メモリ確保が行われることはありません。 そのため、 operator*() や operator->() が定義されてはいますが、 optional オブジェクトはポインタではなくオブジェクトをモデル化します。
optional<T> 型のオブジェクトが文脈的に bool に変換される場合、オブジェクトが値を格納しているならば true に変換され、値を格納していないならば false に変換されます。
optional オブジェクトは以下の場合に値を格納している状態になります。
T型の値または値を格納している他のoptionalから初期化または代入された
optional オブジェクトは以下の場合に値を格納していない状態になります。
- デフォルト初期化された
- std::nullopt_t 型または値を格納していない
optionalから初期化または代入された - メンバ関数 reset() が呼ばれた
オプショナルな参照というものはありません。 参照型の optional を実体化した場合、プログラムは ill-formed です。 代わりに T 型の std::reference_wrapper の optional を使って参照を保持することができます。 それに加えて、タグ型 std::nullopt_t や std::in_place_t (およびその cv 修飾された型) の optional を実体化した場合もプログラムは ill-formed です。
テンプレート引数
| T | - | 初期化状態を管理する値の型。 Destructible の要件を満たさなければなりません |
メンバ型
| メンバ型 | 定義 |
value_type
|
T
|
メンバ関数
| optional オブジェクトを構築します (パブリックメンバ関数) | |
| 格納されている値があれば、それを破棄します (パブリックメンバ関数) | |
| 内容を代入します (パブリックメンバ関数) | |
観察 | |
| 格納されている値にアクセスします (パブリックメンバ関数) | |
| オブジェクトが値を格納しているかどうか調べます (パブリックメンバ関数) | |
| 格納されている値を返します (パブリックメンバ関数) | |
| 利用可能であれば格納されている値を返し、そうでなければ別の値を返します (パブリックメンバ関数) | |
変更 | |
| 内容を交換します (パブリックメンバ関数) | |
| 格納されている値を破棄します (パブリックメンバ関数) | |
| 格納される値をその場で構築します (パブリックメンバ関数) | |
非メンバ関数
(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) |
optional オブジェクトを比較します (関数テンプレート) |
(C++17) |
optional オブジェクトを作成します (関数テンプレート) |
(C++17) |
std::swap アルゴリズムの特殊化 (関数) |
ヘルパークラス
(C++17) |
std::hash アルゴリズムの特殊化 (クラステンプレートの特殊化) |
(C++17) |
未初期化状態の optional 型を表す標識 (クラス) |
(C++17) |
値を格納していない optional へのチェック付きアクセスを表す例外 (クラス) |
ヘルパー
(C++17) |
nullopt_t 型のオブジェクト (定数) |
| その場構築のタグ (クラステンプレート) |
推定ガイド
例
#include <string>
#include <functional>
#include <iostream>
#include <optional>
// 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;
}
// std::reference_wrapper may be used to return a reference
auto create_ref(bool b) {
static std::string value = "Godzilla";
return b ? std::optional<std::reference_wrapper<std::string>>{value}
: 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';
}
if (auto str = create_ref(true)) {
// using get() to access the reference_wrapper's value
std::cout << "create_ref(true) returned " << str->get() << '\n';
str->get() = "Mothra";
std::cout << "modifying it changed it to " << str->get() << '\n';
}
}
出力:
create(false) returned empty
create2(true) returned Godzilla
create_ref(true) returned Godzilla
modifying it changed it to Mothra
関連項目
(C++17) |
型安全な共用体 (クラステンプレート) |
(C++17) |
CopyConstructible な型の任意のインスタンスを保持するオブジェクト (クラス) |