注册 登录
编程论坛 C++教室

绑定到左值的右值引用问题

韩海0312 发布于 2017-06-20 01:31, 1715 次点击
程序代码:
int &&rref = 8; //右值引用
int &&r2 = rref;                //(a)  // error, rref是个左值

class  A {
public:
A()=default;
A(A&& a) {/*...*/};             //(b)
//...
};

A aa = std::move(A());          //(c)
问题描述
std::move 返回的右值引用, 表达式(a)实际调用移动构找函数(b)
相当与,移动构造函数的参数右值引用a绑定到std::move 返回的右值引用上,
可是我们知道,右值引用是不能绑定到左值上的

上述调用是可行的,但是为什么右值引用可以绑定到右值引用上呢?
3 回复
#2
rjsp2017-06-20 08:47
又没听懂
你为什么认为 A aa = std::move(A()); 是错的呀

#3
韩海03122017-06-20 10:10
回复 2楼 rjsp
我知道这是对的,但是按规则好像解释不通

std::move() 返回右值引用(右值引用是左值, 例如int &&cc = 11; cc是左值),
然后调用移动构造函数,移动构造函数的右值引用参数a绑定到std::move() 返回的右值引用上

有点像下面的东西

int &&bb = 10;
int &&ss = bb; /这是错误的,因为是bb个左值,(右值引用绑定到右值的引用这是不可以的)
#4
韩海03122017-06-20 10:43
回复 2楼 rjsp
找到答案了
程序代码:
Things that are declared as 有了右值引用,C++11增加了move构造和move赋值。考虑这个情况:
void foo(X&& x)
{
  // ...
}

那么问题来了,x的类型是右值引用,指向一个右值,但x本身是左值还是右值呢? C++11对此做出了区分
:Things that are declared as rvalue reference can be lvalues or rvalues.
The distinguishing criterion is: if it has a name, then it is an lvalue. Otherwise, it is an rvalue.
1