一時的なオブジェクトについては、私にはわからないことがあると思います。関係を考えると:
class C {};
class F {
public:
C getC() { return C(); };
};
class N {
public:
N( C & base ){};
};
これは機能します:
N n(C());
これは機能しません:
F f;
N n(f.getC()); //compile error
なんで?
一時的なオブジェクトについては、私にはわからないことがあると思います。関係を考えると:
class C {};
class F {
public:
C getC() { return C(); };
};
class N {
public:
N( C & base ){};
};
これは機能します:
N n(C());
これは機能しません:
F f;
N n(f.getC()); //compile error
なんで?
非定数参照(のようなB& base
)は左辺値にのみバインドできます。
F::getC()
C
オブジェクトを値で返すため、呼び出し式f.getC()
は左辺値ではなく右辺値です。
ただし、機能する理由N n(C());
は、無関係の問題によるものです。
これはオブジェクトを宣言しません。これは、「パラメーターを持たず、パラメーターを返す関数へのポインター」タイプのパラメーターをn
返し、受け取るという名前の関数を宣言します。N
C
これは、最も厄介な解析として知られている言語の特殊性の1つの兆候です。これを変更してオブジェクトを宣言するには、次のいずれかが必要です。
N n = C(); // Use copy initialization
N n((C())); // Use more parentheses
C()
ただし、どちらも右辺値式の結果を非const参照にバインドしようとするため、これらは両方ともコンパイルに失敗しますB& base
。
const参照(のような)は、C ++ 11B const& base
の右辺値参照(のような)と同様に、右辺値にバインドできます。B&& base