为什么表达式类型在C ++中的版本之间会发生变化?


13

我尝试理解C ++的表达式类型,我读的越多,我就越困惑,因为我发现C ++草案很难理解,因此倾向于使用其他资源,但是它们彼此矛盾,或者没有考虑到C ++版本之间的措辞和定义有很大的变化。

在下文中,我指的是以下草案:

  • C ++ 11 [ n3690 ](最终草案)
  • C ++ 17 [ n4659 ](最终草案)
  • C ++ 20 [ n4835 ](当前草案)

C++11 3.10左值和右值

... prvalue(“纯” rvalue)是不是xvalue的rvalue。[示例:调用返回类型不是引用的函数的结果是prvalue。文字的值(例如12、7.3e5或true)也是prvalue。—结束示例]

C++17 3.10左值和右值

... prvalue是一个表达式,其求值初始化一个对象或位域,或计算一个运算符的操作数的值,该值由其出现的上下文指定。

C++20 7.2.1值类别*

... prvalue是一个表达式,其求值初始化一个对象或位字段,或者计算一个运算符的操作数(由其出现的上下文指定),或者是cv void类型的表达式。

我会理解措词的更改,并进行了一些调整,但对我而言,整个定义都会更改。有人可以帮我理解吗?例如,为什么删除了一个句子,即prvalue是不是xvalue的rvalue?还是为什么删除了有用的示例?


3
我全都禁止版本特定的语言标签。除了这类问题。
curiousguy


不要考虑C ++版本之间的措词和定义会发生重大变化。 ”但是定义并没有真正改变。在C ++ 11中几乎是prvalue的表达式在C ++ 20中仍然是prvalue。
Nicol Bolas

版本之间的“矛盾”在哪里?您到底要问什么?
Galigator

1
抱歉,C ++ 20发生了变化,但是我注意到该标准存在不一致之处。
Maggyero

Answers:


5

原始的prvalue定义只是一个标签:我们留出某些rvalue(即不是xvalue的rvalue)并为其命名。除非通过不寻常的this用法(或多或少是因为它们是临时性的),否则就无法取得他们的地址,因此可以在创建和传播某些自由的同时不破坏任何内容。(另请参见有关它们没有“具有身份” 的最新讨论。)

新定义明确表示,prvalue是“等待发生”的初始化:一旦为它标识了目标对象,即对其进行初始化。(必须注意的是,在构造prvalue ,初始化仍然会发生,而不仅仅是在原处。)这是基于“强制复制省略”的名称,它基于已经很普遍的等效优化。

对于示例,新的值类别定义被认为非常简单,因此需要更少的示例。对于xvalue仍然有一个(这是最细微的类别)。


感谢您和评论者!差不多可以解释了!
丹尼尔·史蒂芬斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.