当我遇到这种情况时,我正在追踪编译错误:
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选项。
答案 0 :(得分:2)
你需要说: y(std::move(y))
。这是获得可以绑定到右值引用的表达式的唯一方法。只是裸露的表达式y
是一个左值。
(请注意,存储引用类成员是非常危险且难以正确的。)
答案 1 :(得分:2)
任何具有名称的东西都是l值。这意味着构造函数参数y
是一个l值(对int
类型的r值引用),因为它的名称为“y
”。
使用std::move(y)
将其重新设为r值。