1

このケースに来たとき、コンパイルエラーを追跡していました:

struct Y        
{               
  int&& y;      
  Y(int&& y)    
    : y(y)      
  {             
  }             
};              

struct ZZ {};   
struct Z        
{               
  ZZ&& z;       
  Z(ZZ&& z)     
    : z(z)      
  {             
  }             
};

これらは両方とも次のように失敗します。

exec.cpp: In constructor ‘Y::Y(int&&)’:
exec.cpp:57:10: error: invalid initialization of reference of type ‘int&&’ from expression of type ‘int’
exec.cpp: In constructor ‘Z::Z(ZZ&&)’:
exec.cpp:67:10: error: invalid initialization of reference of type ‘ZZ&&’ from expression of type ‘ZZ’

しかし、その理由は正確にはわかりません。ここで何が問題なのですか?

-std=gnu++0x オプションで g++4.5.3 を使用していますが、-std=c++0x オプションでも発生します。

4

2 に答える 2

2

あなたは言う必要があります: y(std::move(y))。これが、右辺値参照にバインドできる式を取得する唯一の方法です。裸の式だけyが左辺値です。

(参照クラスのメンバーを格納するのは非常に危険であり、正しく行うのは難しいことに注意してください。)

于 2013-05-25T15:15:16.827 に答える
2

名前を持つものはすべて左辺値です。これは、名前 " " があるため、コンストラクター パラメーターyが左辺値 ( への右辺値参照型) であることを意味します。inty

std::move(y)r値に戻すために使用します。

于 2013-05-25T15:16:06.110 に答える