C++ 11 - 右值引用变量

C++ 11 - rvalue reference variables

本文关键字:引用 变量 C++      更新时间:2023-10-16

两者有什么区别

int a = 42;

int&& rvr = 42;

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

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

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也会给出不同的结果以供参考。