C++ 11 - 右值引用变量

Woj*_*tek 18 c++ c++11

有什么区别

int a = 42;
Run Code Online (Sandbox Code Playgroud)

int&& rvr = 42;
Run Code Online (Sandbox Code Playgroud)

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

小智 18

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

T a = b;
Run Code Online (Sandbox Code Playgroud)

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

T &&a = b;
Run Code Online (Sandbox Code Playgroud)

另一方面,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
Run Code Online (Sandbox Code Playgroud)

更简单地说,decltype也会给出不同的参考结果.