最終更新日時: 2026年04月07日 15時36分39秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<optional>

# std::optional::value_or(C++17)

    // optional<T>版のオーバーロード
    template <class U> constexpr T value_or(U&& v) const&; // (1)
    template <class U> constexpr T value_or(U&& v) &&;     // (2)

    // optional<T&>版のオーバーロード (C++26)
    template <class U = remove_cv_t<T>>
    constexpr remove_cv_t<T> value_or(U&& u) const;        // (3) C++26

## 概要

有効値もしくは指定された無効値を取得する。

- (1) : `*this`が`const`左辺値である場合。有効値を保持していれば有効値を返し、そうでなければ`v`を返す
- (2) : `*this`が右辺値である場合。有効値を保持していれば有効値をムーブして返し、そうでなければ`v`を返す
- (3) : `optional<T&>`の場合。有効値を保持していれば参照先の値を返し、そうでなければ`u`を返す

`optional<T>`では (1), (2) が定義され、`optional<T&>`では (3) のみが定義される。

## 要件

- (1), (2) : `is_move_constructible_v<T> == true`であること
- (1), (2) : `is_convertible_v<U&&, T> == true`であること

## 効果

- (1), (2) : 以下の式と等価の効果を持つ：

      return has_value() ? value() : static_cast<T>(std::forward<U>(v));

- (3) : 以下の式と等価の効果を持つ：

      return has_value() ? *val : std::forward<U>(u);

## 例

    #include <iostream>
    #include <optional>

    int main()
    {
      std::optional<int> p1 = 3;
      // p1が有効値を持っていればそれが返り、持っていなければ-1が返る
      int result1 = p1.value_or(-1);
      std::cout << result1 << std::endl;

      std::optional<int> p2;
      int result2 = p2.value_or(-1);
      std::cout << result2 << std::endl;
    }

### 出力

    3
    -1

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0.1 ✅
- GCC: 7.2 ✅
- ICC: ??
- Visual C++: ??

## 関連項目

- `optional::value()`
- `optional::has_value()`
- `optional::operator bool()`

## 参照

- P2988R12 `std::optional<T&>`
  - C++26で参照型`T&`に対する部分特殊化を追加