web-dev-qa-db-ja.com

std ::参照型のオプションの特殊化

なぜstd::optional(現時点ではstd::experimental::optionallibc ++)に参照型の特殊化がないのですか(boost::optionalと比較して))?

とても便利なオプションだと思います。

たぶんへの参照を持つオブジェクトはありますか[〜#〜] stl [〜#〜]の既存のオブジェクトセマンティクス?

22

n3406 (提案の改訂#2)が議論されたとき、一部の委員会メンバーはオプションの参照に不快でした。 n3527 (リビジョン#3)では、オプションの値を承認してC++ 14になったものに入れる可能性を高めるために、オプションの参照を補助的な提案にすることにしました。その他のさまざまな理由により、オプションはC++ 14に完全には組み込まれませんでしたが、委員会はオプションの参照を拒否せず、将来誰かが提案した場合にオプションの参照を自由に追加できます。

17
Nevin

確かにへの参照たぶん既存のオブジェクトセマンティクスを持つものがあります。これは(const)ポインターと呼ばれます。プレーンな古い非所有ポインタ。参照とポインタには3つの違いがあります。

  1. ポインタはnullにすることができますが、参照はできません。これがまさにstd::optionalで回避したい違いです。
  2. ポインターは別のものを指すようにリダイレクトできます。 constにすると、その違いも消えます。
  3. 参照は->または*で逆参照する必要はありません。これは純粋な構文上のシュガーであり、1が原因で発生する可能性があります。また、ポインタ構文(逆参照してブールに変換可能)は、値にアクセスしてその存在をテストするためにstd::optionalが提供するものです。

pdate:optionalは値のコンテナです。他のコンテナ(vectorなど)と同様に、参照を含めることはdesignedではありません。オプションの参照が必要な場合は、ポインターを使用します。または、実際にstd::optionalと同様の構文を持つインターフェースが必要な場合は、ポインター用の小さな(そして自明な)ラッパーを作成します。

pdate2:質問についてwhyそのような特化はありません。委員会が単にオプトアウトしたためです。理論的根拠mightは論文のどこかにあります。おそらく、彼らはポインタで十分だと考えていたからです。

7
Arne Mertz

私が推測を危険にさらすなら、それはstd :: experimental :: optionalの仕様のこの文のためでしょう。 (セクション5.2、p1)

テンプレートoptionalのインスタンス化を必要とするプログラムは、参照タイプ、またはcv修飾されたタイプin_place_tまたはnullopt_tの可能性があります。

0
Marshall Clow