なぜstd::optional
(現時点ではstd::experimental::optional
libc ++)に参照型の特殊化がないのですか(boost::optional
と比較して))?
とても便利なオプションだと思います。
たぶんへの参照を持つオブジェクトはありますか[〜#〜] stl [〜#〜]の既存のオブジェクトセマンティクス?
確かにへの参照たぶん既存のオブジェクトセマンティクスを持つものがあります。これは(const)ポインターと呼ばれます。プレーンな古い非所有ポインタ。参照とポインタには3つの違いがあります。
std::optional
で回避したい違いです。->
または*
で逆参照する必要はありません。これは純粋な構文上のシュガーであり、1が原因で発生する可能性があります。また、ポインタ構文(逆参照してブールに変換可能)は、値にアクセスしてその存在をテストするためにstd::optional
が提供するものです。pdate:optional
は値のコンテナです。他のコンテナ(vector
など)と同様に、参照を含めることはdesignedではありません。オプションの参照が必要な場合は、ポインターを使用します。または、実際にstd::optional
と同様の構文を持つインターフェースが必要な場合は、ポインター用の小さな(そして自明な)ラッパーを作成します。
pdate2:質問についてwhyそのような特化はありません。委員会が単にオプトアウトしたためです。理論的根拠mightは論文のどこかにあります。おそらく、彼らはポインタで十分だと考えていたからです。
私が推測を危険にさらすなら、それはstd :: experimental :: optionalの仕様のこの文のためでしょう。 (セクション5.2、p1)
テンプレート
optional
のインスタンス化を必要とするプログラムは、参照タイプ、またはcv修飾されたタイプin_place_t
またはnullopt_t
の可能性があります。