关于右值参考的c ++ 11

时间:2014-09-28 14:20:13

标签: c++ c++11 rvalue-reference

#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

Here's the complete sample

我无法理解。不移动函数返回右值引用吗?

1 个答案:

答案 0 :(得分:2)

§3.10

根据我对标准的解释,lvaluexvalueprvalue是互斥的。

  

每个表达式都属于基本的一个   此分类中的分类: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