2016-11-02 21 views
5

std::optional<int&> xx;最新のgcc-7.0.0スナップショットではコンパイルされません。 C++ 17標準には参照用にstd::optionalが含まれていますか?そしてなぜそれができないのですか? (専用の専門内のポインタを有する実装らしい何の問題も引き起こさないwhould。)[オプション]GCCが参照用にstd :: optionalを拒否する理由は?

+1

をそれはoptional'がどのように動作するか 'はありません@Someprogrammerdude。それ以外の場合は、オプションのを使用することもできません。参照型をサポートするオプションの型を書くことができます。ブーストはそうです。標準では(operator = 'のために)選択しないだけです。 – Barry

+1

参照のポイントはほとんどありません。オプションではありません。 – jthill

+1

'std :: optional >' :-D –

答えて

5

optionalは、C++ 17で標準化されているため、参照型は許可されていません。これは設計上除外されています。

これには2つの理由があります。 1つは、構造的に言えば、optional<T&>T*に相当するということです。それらは異なるインターフェースを持つかもしれませんが、同じことをします。

第2の点は、正確にoptional<T&>がどのように振る舞うべきかという疑問について、標準化委員会によって合意が実質的になかったことです。

は、次のことを考えてみましょう:

optional<T&> ot = ...; 
T t = ...; 
ot = t; 

その最後の行には何をすべき? otによって参照されているオブジェクトを取得していて、それにコピーアサインすると、*ot == t?または、格納されている参照自体を再バインドする必要があります。つまり、ot.get() == &t?さらに悪いことに、割り当ての前にdo different things based on whether ot was engaged or notになりますか?

一部の人々は1つのことをすると予想しますが、一部の人はそれを他の人がやると予想します。したがって、どちらの側を選んでも、誰かが混乱することになります。

あなたの代わりにT*を使用していた場合、たまたま非常に明確になります:

T* pt = ...; 
T t = ...; 
pt = t; //Compile error. Be more specific. 
*pt = t; //Assign to pointed-to object. 
pt = &t; //Change pointer. 
+0

一般的なコードで統一されたインターフェイスが必要なので、私は最初の理由を受け入れません。 2番目の理由として、私にとっては '* ot = t'のように振る舞います。ちなみに、 'boost :: optional'の場合ですか? – Vahagn

+0

「どちらの側を選んでも、誰かが混乱するだろう」 - 解決策は両側を混乱させることです。。) – Vahagn

+0

'ot'が関与していない場合は、' ot = t'の間に例外をスローします。 – Vahagn

2

Inを:

参照型のためのオプション、または場合によってCVのテンプレートのインスタンス化を必要とするプログラム - 修飾タイプin_place_tまたはnullopt_tが不正です。

std::optional<T&>はありません。今のところ、std::optional<std::reference_wrapper<T>>を使用する必要があります。

+0

willこれは ' - >'をサポートしていますか? 'std :: reference_wrapper'は' operator-> 'を実装していないようです。したがって、 'o-> foo'は動作しません。 –

+0

@ JohannesSchaub-litbあなたは 'o-> get()。foo'のように2つの回帰が必要です。' - > 'は' reference_wrapper'を与えます。私は最終的に代入時にリバインドするオプションの「」を得ることを願っています。これは正しい行動であることを多くの人が確信しています。 – Barry

関連する問題