问:为什么_rvalues_被更名为_prvalues_?(纯rvalues)
Q: why _rvalues_ were renamed to _prvalues_? (pure rvalues)
此文档似乎是C 11:N3055的这些更改的来源。
II。更改的概述
rvalues,目前在核心语言条款中已知,被更名 到" prvalues "("纯" rvalues)。
lvalues 含义没有更改,但是 glvalues 被介绍给cover xvalues 。
。为什么不对 rvalues ?!
做同样的事情。rvalues 含义应该保持不变,但也将 grvalues 介绍 xvalues 。( prvalues 可以替换回简单 rvalues 在对称中,如何定义 lvalues )
expression
/
glvalue grvalue
/ /
lvalue xvalue rvalue
值类别可以更简单:
- 一个 lvalue 具有 Identity ,但无法从中移动;是一个不是xvalue 的glvalue
- rvalue 没有身份,但可以从移动;是一个不是xvalue 的grvalue
- a xvalue 具有 Identity ,可以从。。 移动
每个表达式都是 lvalue , xvalue >或 rvalue 。
rvalues的概念变得更加笼统,并且rvalues的本质被确定为缺乏混叠。添加了一个新的值类别,即共享此属性的新值类别,并且在C 11之前存在的RVALUEs子集更名为Prvalues(" Pure Rvalues")。
我们想要的两个主要部门现在是:
- glvalue vs prvalue:glvalues是对象(=存储位置);Prvalues是传统的"临时工"(但请参见下文)。
- lvalue vs rvalue:lvalues结合了lvalue参考,rvalues与rvalue参考结合。这种区别是定义引用和参考绑定的工作方式所需的一种。
xvalue既是glvalue又是rvalue。这反映了一个事实,即rvalue参考是执行lvalue to-xvalue转换(通过cast, std::move
)的一种方法,即具有用户定义的rvalues 。它们还允许通过将RVALUE与RVALUE参考结合(现在是LVALUE)的另一个方向,将Prvalue转换为LVALUE。
c 17通过将prvalues变成不再是对象的"概念值"或"非物质化值",从而进一步完善了这个想法。在这张新图片中,只有glvalues是对象。但是,prvalues可以实现 中的对象,该对象被适当地称为" prvalue to-glvalue conversion"。
这种新的思考价值类别的思考方式意味着,如果您具有函数T f();
,其中T
不是参考,则表达式f()
本身不是对象(因此不必复制对象!)(例如,如果您说 f().x
),则使用prvalue(=实现)创建一个对象,以允许成员访问。
也许总结C 17中存在的所有转换:
" glvalue to-prvalue":这就是C所说的" LVALUE转换"。示例:
int a = 1; 1 + a;
第二操作数添加表达式是一个prvalue,通过glvalue to-prvaluea
的转换获得。" rvalue-to-lue":由RVALUE参考提供。示例:
int && r = e
。这里的e
是一个rvalue表达式,r
是指定相同(或可能实现的)对象的lvalue。" prvalue-to-glvalue":这是prvalue的实现是glvalue。
" lvalue-to-rvalue":仅通过
std::move
实际上以" lvalue-to-xvalue"实际使用,例如。int a; static_cast<int&&>(a);
。
请注意,列表中出现的所有对都具有相同数量的字母 - 两个字母都有一个字母,或者都有两个字母。我认为这是您建议的替代方案缺乏的精心挑选的分类学的结果。
- 带有 std::minmax 和 rvalues 的结构化绑定
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 问:为什么_rvalues_被更名为_prvalues_?(纯rvalues)
- 为什么返回非引用类型的函数表达式被认为是prvalues而不是xvalues
- 从函数返回prvalues
- 非弦乐文字是prvalues
- Objective-C + Cpp rvalues and arrays
- 合格的id,它们是lvalues还是prvalues
- std::move()如何将值转移到RValues中?
- 有没有一种方法可以创建行为像c++ RValues的JavaScript对象?