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