0

一時的なオブジェクトについては、私にはわからないことがあると思います。関係を考えると:

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

なんで?

4

1 に答える 1

3

非定数参照(のようなB& base)は左辺値にのみバインドできます。

F::getC()Cオブジェクトを値で返すため、呼び出し式f.getC()は左辺値ではなく右辺値です。


ただし、機能する理由N n(C());は、無関係の問題によるものです。

これはオブジェクトを宣言しません。これは、「パラメーターを持たず、パラメーターを返す関数へのポインター」タイプのパラメーターをn返し、受け取るという名前の関数を宣言します。NC

これは、最も厄介な解析として知られている言語の特殊性の1つの兆候です。これを変更してオブジェクトを宣言するには、次のいずれかが必要です。

N n = C();  // Use copy initialization
N n((C())); // Use more parentheses

C()ただし、どちらも右辺値式の結果を非const参照にバインドしようとするため、これらは両方ともコンパイルに失敗しますB& base


const参照(のような)は、C ++ 11B const& baseの右辺値参照(のような)と同様に、右辺値にバインドできます。B&& base

于 2012-06-11T17:11:16.947 に答える