为什么以这种方式使用移动语义无效?

时间:2013-05-25 15:13:49

标签: c++ g++ move-semantics

当我遇到这种情况时,我正在追踪编译错误:

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选项。

2 个答案:

答案 0 :(得分:2)

你需要说: y(std::move(y))。这是获得可以绑定到右值引用的表达式的唯一方法。只是裸露的表达式y是一个左值。

(请注意,存储引用类成员是非常危险且难以正确的。)

答案 1 :(得分:2)

任何具有名称的东西都是l值。这意味着构造函数参数y是一个l值(对int类型的r值引用),因为它的名称为“y”。

使用std::move(y)将其重新设为r值。