2016-10-11 7 views
17

optionalvariantは、特に割り当てに関して、リファレンスタイプで何をすべきかについて進行中の議論があります。この問題に関する議論をよりよく理解したいと思います。引数を回避し、まだ私たちのほとんどの機能を与えるために -オプション<T&>割り当て時に再バインドする必要があるのはなぜですか?

optional<T&> opt; 
opt = i; 
opt = j; // should this rebind or do i=j? 

現在、意思決定が病気に形成されたoptional<T&>を作成し、タイプのいずれかが参照型である場合、variant::operator=が病気に形成されたようにすることです。

opt = jは、の基礎となる参照を再バインドする必要がありますか?

template <class T> 
struct optional<T&> { 
    T* ptr = nullptr; 

    optional& operator=(T& rhs) { 
     ptr = &rhs; 
     return *this; 
    } 
}; 
+3

あなたの例では、 'opt = i'が参照をバインドし、次に' opt = j'が参照を使って割り当てた場合、気にしないでしょうか? –

+1

割り当てを使用して通常参照を結びつけることはほとんどできません。 –

+0

'opt'が関数の引数として与えられたときに特に気になり、実行時に' opt = i; 'が代入するかどうかによって決まります –

答えて

20

= jの基礎となる参照を再バインドする必要があり選ぶの引数がどのようなものです:つまり、なぜ我々はこのようなoptionalを実装する必要がありますか?

あなたが探している「引数」が何であるか分かりません。しかし、あなたはそれのための「引数」を発表しました:

optional<T&> opt; 
opt = i; 
opt = j; 

は今、2行目と3行目は、互いから離れていることをふりをします。コードを読んでいるだけの方は、opt = jに何をすると思いますか?それ以上のことは、なぜその行動がopt = iと異なると思いますか?

純粋にその現在の状態に基づいて大幅に異なるラッパータイプの動作を持たせることは非常に驚くべきことです。

さらに、値optionalに変更することを通知する方法があります。すなわち:*opt = j。これは、optional<T>の場合と同様に、optional<T&>の場合と同様に機能します。

方法はoptionalです。これはラッパータイプです。現在の既存のラッパータイプと同様に、ラッパータイプはラッパーに影響します。ラップするものではありません。ラップされているものに影響を与えるには、*または->または他のインターフェイス関数を明示的に使用します。

+3

ラッパの最も魅力的な操作を見つけた最後の段落は、ラッパーに作用します。しかし残りはすべて意味があります。 – Barry

+0

実際には、参照が関与していなくても、従属オプションに代入するときにoperator =をタイプTにしないという議論です。 –

+1

@ГригорийШуренковWat?その場合、 'operator = 'が何をすべきかという疑問はありません。おそらくそれが意味することができるのは1つだけです。 – Barry

関連する問題