问:为什么_rvalues_被更名为_prvalues_?(纯rvalues)

Q: why _rvalues_ were renamed to _prvalues_? (pure rvalues)

本文关键字:rvalues prvalues 为什么      更新时间:2023-10-16

此文档似乎是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-prvalue a的转换获得。

  • " 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);

请注意,列表中出现的所有对都具有相同数量的字母 - 两个字母都有一个字母,或者都有两个字母。我认为这是您建议的替代方案缺乏的精心挑选的分类学的结果。