GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::optional::value_or - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. optional
  3. optional
  4. value_or

最終更新日時: 2026年09月22日 23時31分02秒 (JST)
rotarymars が更新

履歴 編集

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) のみが定義される。

テンプレートパラメータ制約

  • (3) : Tが非配列オブジェクト型であること。

要件

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

効果

  • (1) : 以下の式と等価の効果を持つ:

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

  • (2) : 以下の式と等価の効果を持つ:

    return has_value() ? std::move(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 ✅
  • Visual C++: ??

関連項目

  • optional::value()
  • optional::has_value()
  • optional::operator bool()

参照

  • P2988R12 std::optional<T&>
    • C++26で参照型T&に対する部分特殊化を追加
  • LWG Issue 4304. std::optional<NonReturnable&> is ill-formed due to value_or
    • C++26で、optional<T&>の(3) value_orに「Tが非配列オブジェクト型であること」という制約が追加された。Tが配列型・関数型のとき戻り値型remove_cv_t<T>が不正となりoptional<T&>自体の実体化が失敗する問題を防ぐもの
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.