Namespaces
Variants

std::optional<T>:: operator->, std::optional<T>:: operator*

From cppreference.net
Utilities library
constexpr const T * operator - > ( ) const noexcept ;
(1) (C++17以降)
constexpr T * operator - > ( ) noexcept ;
(2) (C++17以降)
constexpr const T & operator * ( ) const & noexcept ;
(3) (C++17以降)
constexpr T & operator * ( ) & noexcept ;
(4) (C++17以降)
constexpr const T && operator * ( ) const && noexcept ;
(5) (C++17以降)
constexpr T && operator * ( ) && noexcept ;
(6) (C++17以降)

格納されている値にアクセスします。

1,2) 格納されている値へのポインタを返します。
3-6) 格納されている値への参照を返します。

has_value() false の場合、動作は未定義です。

(C++26まで)

has_value() false の場合:

  • 実装が hardened されている場合、 contract violation が発生します。さらに、契約違反ハンドラが「observe」評価セマンティクスの下で戻った場合、動作は未定義です。
  • 実装がhardenedされていない場合、動作は未定義です。
(C++26以降)

目次

戻り値

1,2) val
3,4) * val
5,6) std :: move ( * val  )

注記

この演算子は * this が値を保持しているかどうかをチェックしません。ユーザーは手動で has_value() または operator bool() を使用して確認できます。あるいは、チェック付きアクセスが必要な場合は、 value() または value_or() を使用できます。

#include <iomanip>
#include <iostream>
#include <optional>
#include <string>
int main()
{
    using namespace std::string_literals;
    std::optional<int> opt1{1};
    std::cout << "opt1: " << *opt1 << '\n';
    *opt1 = 2;
    std::cout << "opt1: " << *opt1 << '\n';
    std::optional<std::string> opt2{"abc"s};
    std::cout << "opt2: " << std::quoted(*opt2) << ", size: " << opt2->size() << '\n';
    // optionalオブジェクトが右辺値の場合、operator*を呼び出すことで含まれる値を「取り出す」ことができます
    auto taken = *std::move(opt2);
    std::cout << "taken: " << std::quoted(taken) << "\n"
                 "opt2: " << std::quoted(*opt2) << ", size: " << opt2->size() << '\n';
}

出力:

opt1: 1
opt1: 2
opt2: "abc", size: 3
taken: "abc"
opt2: "", size: 0

不具合報告

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

DR 適用対象 公開時の動作 正しい動作
LWG 2762 C++17 operator-> および operator* が例外を送出する可能性があった noexceptに変更

関連項目

格納されている値を返す
(公開メンバ関数)
利用可能な場合は格納されている値を、それ以外の場合は別の値を返す
(公開メンバ関数)