2017-01-09 8 views
4

は、私はそれがはるかに困難デフォルトを使用すると、実行時例外が発生しreference_wrapper構築していても、使用できるようになりstd::reference_wrapper<T>を防止することは、デフォルト構築可能であることを感じています。なぜstd :: reference_wrapperはデフォルトでコンストラクタブルではないのですか?

しかし、reference_wrapperは完全にコピー可能ですので、値は常に変更できるので、デフォルトで null参照を持つようにしてください。多くのユースケースがはるかに簡単になり、提案されたobserver_ptrはもう必要ありません。なぜ冗長性が必要なのですか?デフォルトの構成可能なreference_wrapperはすべてそれらを支配するでしょう!

思考?

+1

おそらくあなたは、アントニー・ホーア、null参照の発明は、後に「数十億ドル規模の間違い」としての彼の発明と呼ばことを知ってほしいです。いいえ、私たちはデフォルトでヌル可能な参照が大変ありがとうございません。 –

+0

ハハ、あなたは大歓迎です。 ;-) – Dejavu

答えて

7

しかし、reference_wrapperは完全にコピー可能ですので、値は常に変更できるので、デフォルトでnull参照を持つことを避けるのはなぜですか?

std::reference_wrapperのポイントはヌル値を持っているだろうか?あなたがnull値を持つ必要がある場合は、単にポインタを使用:P

std::reference_wrapperを参照のラッパーとして構築され、それはそれです。参照と同じように動作する必要があります。そうでなければ、ラッパーではありません。そのためのユースケースがあります。そのユースケースは、デフォルト値を許可すると壊れる可能性があります。 ヌルの値が必要な場合は、ポインタのようなものを使用するか、参照の制限付きで使用してください。

はまた、あなたはその理由を自分で述べる:

[...]でも、実行時例外が発生しreference_wrapper構築し、デフォルトを使用しているが。

何を参照したのポイントは何ですか? std::reference_wrapperは、リファレンスと同じように、何かを参照することを意味します。ヌル値を追加すると、ヌルであるかどうかを参照するたびに追加コードが追加されます。

それは多分、はい

[...]多くの利用例は非常に簡単になります。でも、以外のユースケースはるかに難しくなります。ラッパーが有効かどうかをチェックする必要があります。デフォルトのコンストラクターを持つメンバーとして使用されたときなどに初期化することを忘れないでください。要するに

std::reference_wrapperは、参照するだけのラッパーで、そのように単純に基準より何か他のもののように振る舞うことができません。すべてに利点と欠点があります。ここではstd::observer_ptrが必要な場合がありますが、それ以外の場合は何も確認する必要はありません。

+0

私は参照が宙ぶらりしているかもしれないと主張していますが、デフォルトではnull参照に構築でき、少なくともダングリングよりもあるレベルの決定論を提供します。また、参照が現在ぶら下がっていることを知った後で、デフォルトの構築されたnull参照を割り当てたり、参照ラッパーをnullにリセットしたりすることは有用です。 – Dejavu

+0

など。私は、事前に割り当てられたreference_wrapperの配列を事前に割り当てておくことができ、使用可能なエントリに有効な参照を割り当てることができ、使用後に参照をnullに戻すことができます。あらかじめ割り当てられたreference_wrapperコンテナを許可しない現在の定義よりも使用するほうがずっと使いやすく、多くの潜在的なユースケースシナリオを無効にします。 – Dejavu

+1

@Dejavuあなたはnull可能なポインタを持っています。 NULL値は、ポインタがぶら下がっているかどうかを判断するのに役立ちますか? –

関連する問題