现代c ++,理解xvalue

modern c++, understanding of xvalue

本问题已经有最佳答案,请猛点这里访问。

现代C++只添加了一种新的"xValm"?函数返回的右引用是xvalue,这是定义的,就像函数参数中的右引用一样,它只能绑定到右值?这些理解正确吗?与本主题相关的问题和答案从学习者的角度来处理这个问题。在这里,我试图从设计师的角度来了解这个主题。例如,int b=3;int&;x=std::move(b);std::move的返回值是一个x value,它可以绑定到引用,这是由设计器设置的规则。(合理和可用)。设计器还可以设置XValue需要绑定左侧引用的规则,即使这不是一个好规则。


注意这里的术语。函数参数或函数返回类型可以是右值引用类型,但不是XValue,因为术语"XValue"只适用于表达式。

每个表达式要么是左值,要么是XValue,要么是prValue。最常见的XValue类型是一个表达式,它调用一个函数,该函数的返回类型为右值引用类型。对右值引用类型执行强制转换的表达式也是XValue。表达式也可以通过其他几种方式成为xValue。

右值引用是一种类型。用右值引用类型声明的变量可以用xvalue或prvalue初始化,但不能用左值初始化(除非通过用户定义的转换)。记住,声明为右值引用的变量的名称是左值,而不是XValue!

1
2
3
4
int n = 3;                          // 1
int&& r1 = static_cast<int&&>(n);   // 2
int&& r2 = std::move(r1);           // 3
int&& func(int&& arg);              // 4

此代码示例中的表达式为:

  • 3第1行:一个prvalue
  • n第2行:左值
  • static_cast(n)第2行:xvalue
  • r1第3行:左值
  • std::move(r1)第3行:xvalue

第4行中根本没有表达式。