有什么区别
int a = 42;
和
int&& rvr = 42;
?
a
显然是一个 lvalue
,但是 rvr
也是一个 lvalue
因为它是一个命名变量,那么这些表达式是否可以被认为是完全等价的,如果不是,在哪些情况下首选 int&&
声明?
最佳答案
它们并不完全等价。你是对的,这两个变量都是左值,但是对于大多数类型,表单的初始化
T a = b;
创建一个临时 T
对象,然后从该临时对象构造 a
。该临时对象可能会被省略,但它仍然需要适当的构造函数可用。
T &&a = b;
另一方面,将 a
直接绑定(bind)到 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
也会给出不同的引用结果。
关于C++ 11 - 右值引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27603035/