Namespaces
Variants

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

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変長引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
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() が falsefalse の場合、動作は未定義です。

(C++26 まで)

has_value() が falsefalse の場合:

  • 実装がハードニングされている場合、契約違反が発生します。
  • 実装がハードニングされていない場合、動作は未定義です。
(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に変更

関連項目

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