如何定义 xvalue 混合类别?

How to define xvalue mixed category?

xvalues glvaluesrvalues 都在同一时间吗?或者 xvalue 可能是 glvaluervalue?

如果是glvalueor/xorrvalue,你能举个例子吗?

来自cppreference

An rvalue expression is either prvalue or xvalue.

an xvalue (an “eXpiring” value) is a glvalue that denotes an object or bit-field whose resources can be reused;

回答您的问题:

Are all xvalues glvalues and rvalues at the same time?

是的。更具体地说,右值是 prvalue 和 xvalue 的超集。因此,所有 xvalues 都是 rvalues,但并非所有 rvalues 都是 xvalues(即,那些是 prvalues 的)。根据上面的定义,xvalue 是一个可重用的 glvalue。所以 xvalues 是 glvalues 和 rvalues.

Or a xvalue may be either glvalue or a rvalue?

没有。 xvalue 纯粹是可重用的 glvalue,可重用的 glvalues(即 xvalues)是右值。想想移动语义。

示例:

int a = 6;
foo(6); // 6 is a prvalue (and thus is an rvalue)
foo(a); // a is a glvalue

std::vector<int> vec = {1, 2, 3};
bar(vec);            // vec is a glvalue
bar(std::move(vec)); // std::move(vec) is an xvalue (reusable glvalue)
                     // (and thus is an rvalue)

我认为理解值类别的关键是理解值和对象之间的区别。一个值只是一个类型的抽象实例,是构成与特定类型实例相关联的信息的所有可能位模式之一。另一方面,对象是存储在内存中特定位置的特定存储片段,其方式可以将特定类型的值存储在该位置。我们说对象持有那个类型的值。

像这样思考整个 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 的共同点是缺乏持久性,这是一般右值的定义特征。 xvalue 和 lvalue 的共同点是特定的存储位置,这是一般 glvalue 的定义特征。 xvalue 只是一个没有持久性的左值,因此可以像右值一样对待......