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) :
*thisがconst左辺値である場合に、有効値へのconst左辺値参照を返す - (4) :
*thisがconst右辺値である場合に、有効値への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
処理系
- Clang: 4.0.1 ✅
- GCC: 7.2 ✅
- ICC: ??
- Visual C++: ??