什么是C ++中的xvalue

我试图了解值类别的差异,并发现microsoft提供了this document

什么是C ++中的xvalue

- An xvalue is a glvalue that [...]
- An lvalue is a glvalue that is not an xvalue.
- An rvalue is a prvalue or an xvalue.

为什么xvalueglvalue?他们为什么不说An xvalue is an glvalue or an rvalue?在我看来,这个措词是故意传达的,但我不明白为什么

zhiyin1985 回答:什么是C ++中的xvalue

  

为什么他们不说xvalue是glvalue或rvalue?

因为尚未定义rvalue并且因为rvalue将根据xvalue进行定义。必须定义一个而不依赖另一个,以避免该定义成为循环。

此外,因为xvalue既是glvalue,又是rstrong。

此外,xvalue是不是lvalue的glvalue。更进一步,xvalue是不是prvalue的rvalue。最后,xvalue是既不是左值也不是prvalue的表达式。

  

我不明白为什么他们只在那句话中提到了gvalues

仅定义了glvalue和prvalue。请参阅前面提到的避免循环定义的内容。

  

什么是C ++中的xvalues

好吧,您已经看到了它的定义。该标准具有以下非规范性注释,可提供更多信息:

  

[basic.lval]

     

[注意:如果表达式是xvalue,则它是:

     
      
  • 调用函数(无论是隐式还是显式)的结果,该函数的返回类型是对对象类型([expr.call])的右值引用,
  •   
  • 强制转换为对对象类型([expr.type.conv],[expr.dynamic.cast],[expr.static.cast],[expr.reinterpret.cast],   [expr.const.cast],[expr.cast])
  •   
  • 具有xvalue数组操作数([expr.sub])的下标操作,
  •   
  • 类成员访问表达式,它指定非引用类型的非静态数据成员,其中对象表达式是一个   xvalue([expr.ref]),或
  •   
  • 。*指向成员的表达式,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针   ([expr.mptr.oper])。
  •   
,

该图可能会引起误解。

有左值,右值和右值。它们是互斥且完整的,即每个表达式都恰好是以下之一:lvalue,xvalue或prvalue。

lvalues和xvalues统称为glvalues
xvalues和prvalue统称为右值

所以xvalues既是glvalues又是rvalues。

本文链接:https://www.f2er.com/3162869.html

大家都在问