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

履歴 編集

function
<optional>

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

    // optional<T>版のオーバーロード
    constexpr const T& value() const&;   // (1) C++17
    constexpr T& value() &;              // (2) C++17
    constexpr T&& value() &&;            // (3) C++17
    constexpr const T&& value() const&&; // (4) C++17

    // optional<T&>版のオーバーロード (C++26)
    constexpr T& value() const;          // (5) C++26

## 概要

有効値を取得する。

- (1) : `*this`が`const`左辺値である場合に、有効値への`const`左辺値参照を返す
- (2) : `*this`が非`const`左辺値である場合に、有効値への非`const`左辺値参照を返す
- (3) : `*this`が右辺値である場合に、有効値への右辺値参照を返す
- (4) : `*this`が`const`右辺値である場合に、有効値への`const`右辺値参照を返す
- (5) : `optional<T&>`の場合に、参照先への左辺値参照を返す

`optional<T>`では (1)～(4) が定義され、`optional<T&>`では (5) のみが定義される。

## 効果

- (1), (2), (5) : 有効値を保持している場合、有効値への参照を返す
- (3), (4) : 有効値を保持している場合、有効値をムーブして返す

## 例外

有効値を保持していない状態でこの関数が呼び出された場合、`bad_optional_access` 例外を送出する。

## 例

    #include <iostream>
    #include <optional>

    int main()
    {
      std::optional<int> p1 = 3;
      if (p1) {
        int result = p1.value(); // 保持している値を取得する
        std::cout << "p1 : " << result << std::endl;
      }

      std::optional<int> p2;
      try {
        p2.value(); // 有効値を保持していないのに、有効値を取り出そうとした
      }
      catch (std::bad_optional_access& e) {
        std::cout << "p2 exception : " << e.what() << std::endl;
      }
    }

### 出力

    p1 : 3
    p2 exception : bad optional access

## バージョン

### 言語

- C++17

### 処理系

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

## 参照

- getかvalueか - Faith and Brave - C++で遊ぼう
- P2988R12 `std::optional<T&>`
  - C++26で参照型`T&`に対する部分特殊化を追加