如何定义 xvalue 混合类别?
How to define xvalue mixed category?
xvalues
glvalues
和 rvalues
都在同一时间吗?或者 xvalue
可能是 glvalue
或 rvalue
?
如果是glvalue
or/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 只是一个没有持久性的左值,因此可以像右值一样对待......
xvalues
glvalues
和 rvalues
都在同一时间吗?或者 xvalue
可能是 glvalue
或 rvalue
?
如果是glvalue
or/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 只是一个没有持久性的左值,因此可以像右值一样对待......