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++: ??