std::optional<T>::operator->, std::optional<T>::operator*
From cppreference.com
| constexpr const T* operator->() const noexcept; |
(1) | (C++17以降) |
| constexpr T* operator->() noexcept; |
(1) | (C++17以降) |
| constexpr const T& operator*() const& noexcept; |
(2) | (C++17以降) |
| constexpr T& operator*() & noexcept; |
(2) | (C++17以降) |
| constexpr const T&& operator*() const&& noexcept; |
(2) | (C++17以降) |
| constexpr T&& operator*() && noexcept; |
(2) | (C++17以降) |
格納されている値にアクセスします。
1) 格納されている値へのポインタを返します。
2) 格納されている値への参照を返します。
*this が値を格納していない場合、動作は未定義です。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
格納されている値へのポインタまたは参照。
[編集] 注意
この演算子は、optional が値を含んでいるかどうかをチェックしません!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'; // You can "take" the contained value by calling operator* on an rvalue to optional 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 に変更されました |
[編集] 関連項目
| 保持されている値を返す (public member function) | |
| 保持されている値が利用可能であればそれを返し、そうでなければ別の値を返す (public member function) |