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

Why did expression types change in C++ between versions?

本文关键字:之间 版本 变化 C++ 表达式 类型 为什么      更新时间:2023-10-16

我试图理解C++的表达式类型,读得越多,我就越困惑,因为我发现C++草案很难消化,因此更喜欢其他资源,但它们要么相互矛盾,要么没有考虑到C++版本之间的措辞和定义会发生重大变化。

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

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

C++113.10 Lvalue和右值

prvalue("纯"右值(是一个不是xvalue的右值。[示例:调用返回类型不是的函数的结果引用是一个prvalue。文字的值,如12、7.3e5或true也是一个prvalue。——结束示例]

C++173.10 L值和右值

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

C++207.2.1价值类别*

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

我理解措辞的变化,并进行了一些调整,但对我来说,整个定义都发生了变化。有人能帮我理解吗?例如,为什么删除了prvalue是不是xvalue的右值这句话?或者为什么这个有用的例子被删除了?

最初的prvalue定义只是一个标签:我们留出某些右值(即那些不是xvalue的右值(,并为它们命名。除非通过不寻常的this使用(或多或少是因为它们是临时的(,否则不可能获取它们的地址,因此可以在不破坏任何东西的情况下自由创建和传播它们。(另见最近关于他们没有"身份"的讨论。(

新定义明确表示,prvalue是"等待发生"的初始化:一旦为其识别了目标对象,它就是被初始化的对象。(需要注意的是,当构建prvalue时,初始化仍然会发生,而不是所在的。(这被称为"强制复制省略",基于已经很常见的等效优化。

至于这个例子,人们认为新的价值类别定义要简单得多,因此需要更少的例子。xvalues(这是最微妙的类别(仍然有一个。