Namespaces
Variants

std::optional<T>::value_or

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型, RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
交換 と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
template< class U = std::remove_cv_t<T> > 
constexpr T value_or( U&& default_value ) const&;
(1) (C++17 以降)
template< class U = std::remove_cv_t<T> > 
constexpr T value_or( U&& default_value ) &&;
(2) (C++17 以降)

*this が値を保持している場合はその値を返し、そうでない場合は default_value を返す。

1) std::is_copy_constructible_v<T> && std::is_convertible_v<U&&, T> が false の場合、プログラムは ill-formed となる。
2) std::is_move_constructible_v<T> && std::is_convertible_v<U&&, T> が false の場合、プログラムは ill-formed となる。

パラメータ

default_value - *thisが値を含まない場合に返される値

戻り値

1) has_value ( ) ? ** this : static_cast < T > ( std:: forward < U > ( default_value ) ) ;
2) has_value ( ) ? std :: move ( ** this ) : static_cast < T > ( std:: forward < U > ( default_value ) )

例

#include <cstdlib>
#include <iostream>
#include <optional>
std::optional<const char*> maybe_getenv(const char* n)
{
    if (const char* x = std::getenv(n))
        return x;
    else
        return {};
}
int main()
{
    std::cout << maybe_getenv("SHELL").value_or("(none)") << '\n';
    std::cout << maybe_getenv("MYPWD").value_or("(none)") << '\n';
}

出力例:

/usr/bin/zsh
(none)

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3886 C++17 U はデフォルトテンプレート引数を持たない 指定済み

関連項目

格納されている値を返す
(公開メンバ関数)