最終更新日時(UTC):
が更新

履歴 編集

function
<optional>

std::optional::operator*(C++17)

constexpr T& operator*() &;                 // (1)
constexpr T&& operator*() &&;               // (2)
constexpr const T& operator*() const&;      // (3)
constexpr const T&& operator*() const&&;    // (4)

概要

有効値を取得する。

  • (1) : *this が非 const 左辺値である場合に、有効値への非 const 左辺値参照を返す
  • (2) : *this が非 const 右辺値である場合に、有効値への非 const 右辺値参照を返す
  • (3) : *thisconst 左辺値である場合に、有効値への const 左辺値参照を返す
  • (4) : *thisconst 右辺値である場合に、有効値への const 右辺値参照を返す

要件

has_value() == true であること。

戻り値

  • (1) : 有効値への非 const 左辺値参照
  • (2) : 有効値への非 const 右辺値参照
  • (3) : 有効値への const 左辺値参照
  • (4) : 有効値への const 右辺値参照

例外

  • 投げない

備考

optional クラスはスマートポインタとしても見なせるため、この演算子のようなポインタのインタフェースを持つ。
非ポインタインタフェースである value() の方がより明示的な(視覚的に目立つ)アクセス方法ではあるが、本演算子は value() とは異なり has_value() != true の場合に使用すると未定義動作となる。(value()bad_optional_access 例外を送出する)
逆に言えば、ライブラリ実装は本演算子の実装時に has_value() == true であることのチェックを行う必要が無いため、あらかじめ has_value() == true であることが分かっている場合には、おそらく value() よりも本演算子の方が速度的には有利だろう。(ただし、規格でチェックを禁止されているわけではない)

#include <iostream>
#include <optional>

int main()
{
  std::optional<int> p = 3;
  if (p) {
    // 保持している値を取得する
    std::cout << *p << '\n';

    // 参照なので変更も可能
    *p = 42;
    std::cout << *p << '\n';
  }
}

出力

3
42

バージョン

言語

  • C++17

処理系

関連項目