std::optional
が提案された最初の時期、中身のデータを取り出す方法が、間接参照演算子しかありませんでした。そのあと、私が「boost::optional
にはget()
メンバ関数があるが、こちらにはない。私はポインタインタフェースよりは、そちらを使いたい。」と提案したところ、get()
メンバ関数の代わりに、value()
メンバ関数が入りました。
その経緯としてはこういうものです。
shared_ptr
とunique_ptr
には、生ポインタを取得するためのget()
メンバ関数がある。optional
は、見ようによってはスマートポインタと見なすこともできる。optional
にget()
メンバ関数を入れるのであれば、スマートポインタのように、ポインタを返すべきではないか。optional
のget()
はスマートポインタのインタフェースではなく、生データ(raw data, base data)を参照するセマンティクスなので、別名としてvalue()
にしよう。
この結論を悪いとは思いませんが、私個人は、optional
、boost::initialized
、std::chrono::duration
のようなラッパー型の、生データを参照するインタフェースを共通化したいと考えるので、私が作るクラスでは、get()
メンバ関数に統一をしています。
先日の「チェック付き間接参照の提案 またの名をパターンマッチ」が受け入れられる場合は、生データを参照するインタフェースが共通していたほうがいいでしょうから、そのような話になったら、optional
のインタフェースも見直しになるかもしれません。間接参照演算子を共通インタフェースにはしたくないけどポインタも扱えるようにしたい、というなら、traitsのような中間インタフェースを用意することになるとは思います。