#include <iostream>
using namespace std;
int&& move(int&& t) {
return static_cast<int &&>(t);
}
int main() {
move(5) = 10;//why error?
return 0;
}
错误
prog.cpp:9:13: error: using xvalue (rvalue reference) as lvalue
我无法理解。不移动函数返回右值引用吗?
答案 0 :(得分:2)
§3.10
根据我对标准的解释,lvalue
,xvalue
和prvalue
是互斥的。
每个表达式都属于基本的一个 此分类中的分类:lvalue,xvalue或prvalue。
5
等文字是prvalue
。
- prvalue(“纯”rvalue)是一个不是xvalue的rvalue。 [ 示例:调用返回类型不是a的函数的结果 参考是一个prvalue。文字的值,如12,7.3e5或 true也是一个prvalue。 - 结束例子]
在“移动”功能中,您会得到xvalue
因为:
[示例:调用返回类型为的函数的结果 右值参考是一个x值。 - 结束例子]
至于你的作业失败的原因,请参阅:
5为了修改对象,必须使用对象的左值 除了类型的右值也可以用来修改它 在某些情况下指称。 [示例:成员函数 调用aobject(9.3)可以修改对象。 - 结束例子]
cppreference's page on assigment operators用更简洁的语言表达了这一点。
直接赋值运算符期望左边有一个可修改的左值 操作数和右值表达式或braced-init-list(自C ++ 11起) 作为右操作数,并返回标识左边的左值 修改后的操作数。
最后:
move(5) = 10
xvalue ^ prvalue ^
参考: Value categories