所有xvalues
glvalues
和rvalues
是否都同时存在?还是xvalue
可以是glvalue
或rvalue
?
如果它是glvalue
或/或rvalue
,可以为每种情况举一个例子吗?
答案 0 :(得分:2)
我认为理解值类别的关键是理解值和对象之间的区别。值只是一种类型的抽象实例,它是构成与特定类型的实例相关联的信息的所有可能的位模式之一。另一方面,对象是在存储器中的特定位置处留出的特定存储,其方式是可以将特定类型的值存储在该位置中。我们说对象持有该类型的值。
像这样处理整个prvalue,xvalue,lvalue业务:prvalue只是给定类型的值,它不一定存储在任何地方。实际上,它只是给定类型的值,仅在出现该表达式的特定点上仅存在一瞬间。另一方面,左值标识存储了特定类型值的特定对象。该对象具有一定的定义良好的时间,在该时间段内该对象处于活动状态,并保留存储在其中的所有值。左值本身不是特定类型的值,它标识持有特定类型值的对象。因此,prvalue和lvalue排序位于频谱的两个相对端,prvalue只是没有特定存储的值,没有持久性,而lvalue标识特定存储的某段存储值。一个xvalue介于两者之间。 xvalue标识特定位置的特定对象,但是不再需要存储在其中的值。从这个意义上讲,xvalue与lvalues和prvalues共享属性:它在特定位置标识一个对象,但是存储在该对象中的值没有持久性:
explicit storage location persistence
prvalue no no
xvalue yes no
lvalue yes yes
prvalue和xvalue的共同点是缺乏持久性,这是一般rvalue的定义特征。 xvalue和lvalue的共同点是特定的存储位置,这是一般glvalue的定义特征。 xvalue只是一个没有持久性的左值,因此可以像右值一样对待。
答案 1 :(得分:1)
来自cppreference:
右值表达式可以是prvalue或xvalue。
xvalue(一个“ eXpiring”值)是一个glvalue,表示可以重用其资源的对象或位域;
回答您的问题:
所有xvalues是否同时具有glvalues和rvalues?
是的。更具体地说,rvalue是prvalue和xvalue的超集。因此,所有xvalue均为rvalue,但并非所有rvalue均为xvalue(即prvalue的值)。根据上面的定义,xvalue是可重用的glvalue。因此xvalue既是glvalues又是rvalues。
或者xvalue可以是glvalue或rvalue?
不。 xvalue纯粹是可重用的glvalue,可重用的glvalues(即xvalues)是rvalues。想想移动语义。
示例:
null