C ++ 11 - 右值引用变量

时间:2014-12-22 12:46:21

标签: c++ c++11

之间有什么区别
int a = 42;

int&& rvr = 42;

a显然是lvalue,但rvr也是lvalue,因为它是一个命名变量,所以这些表达式可以被认为是完全等效的,如果不是,在哪种情况下首选int&&声明?

1 个答案:

答案 0 :(得分:18)

它们并不完全等同。你是对的,两个变量都是左值,但对于大多数类型,初始化形式

T a = b;

创建一个临时T对象,然后从该临时对象构造a。可以省略该临时对象,但仍需要适当的构造函数。

T &&a = b;
另一方面,

a直接绑定到b,但需要b作为右值。所以:

int a = 3;
// int&&b = a; // error: && cannot bind to lvalues
int b = a; // okay

struct S { S(const S &) = delete; };
S f();
// S s = f(); // error: no copy or move constructor available
S&&s = f(); // okay

更简单地说,decltype也会为参考文献提供不同的结果。