C++ C++;11-右值参考变量

C++ C++;11-右值参考变量,c++,c++11,C++,C++11,两者的区别是什么 int a = 42; 及 ? a显然是一个lvalue,但是rvr也是一个lvalue,因为它是一个命名变量,所以这些表达式可以被认为是完全等价的,如果不是,在哪些情况下首选int&声明?它们不是完全等价的。您是对的,这两个变量都是左值,但对于大多数类型,都是表单的初始化 T a = b; 创建一个临时T对象,然后从该临时对象构造a。该临时对象可以省略,但仍然需要适当的构造函数 T &&a = b; 另一方面,将a直接绑定到b,但要求b为右值。因此: i

两者的区别是什么

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

您读过吗?这是关于
auto
,但是那里的答案很可能会澄清你的问题。使用
[](auto&&x){f(std::forward(x));}
是使用
&
decltype
@Yakk的一个实际例子,没错,但这是C++14,而不是C++11。在C++11中,
decltype
可以以相同的方式使用,但由于lambda或函数参数不能声明为
auto
,因此此特定模式不适用。您能解释一下S f()的含义吗;有吗?@HaiBi这只是一个名为
f
的函数的常规声明,不带参数,返回
s
。与int&&b=a相比,auto&&b=a是可以接受的,auto&&这里指的是一个通用引用,推导为int&
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