为什么C++中的表达式类型在不同版本之间会发生变化
Why did expression types change in C++ between versions?
我试图理解C++的表达式类型,读得越多,我就越困惑,因为我发现C++草案很难消化,因此更喜欢其他资源,但它们要么相互矛盾,要么没有考虑到C++版本之间的措辞和定义会发生重大变化。
在下文中,我指的是以下草案:
- C++11[n3690](最终草案(
- C++17[n4659](最终草案(
- C++20[n4835](当前草案(
C++11
3.10 Lvalue和右值prvalue("纯"右值(是一个不是xvalue的右值。[示例:调用返回类型不是的函数的结果引用是一个prvalue。文字的值,如12、7.3e5或true也是一个prvalue。——结束示例]
C++17
3.10 L值和右值prvalue是一个表达式,其求值初始化对象或位字段,或计算运算符的操作数的值,如由其出现的上下文指定。
C++20
7.2.1价值类别*prvalue是一个表达式,其求值初始化对象或位字段,或计算运算符的操作数的值,如由其出现的上下文指定,或由具有类型cv void。
我理解措辞的变化,并进行了一些调整,但对我来说,整个定义都发生了变化。有人能帮我理解吗?例如,为什么删除了prvalue是不是xvalue的右值这句话?或者为什么这个有用的例子被删除了?
最初的prvalue定义只是一个标签:我们留出某些右值(即那些不是xvalue的右值(,并为它们命名。除非通过不寻常的this
使用(或多或少是因为它们是临时的(,否则不可能获取它们的地址,因此可以在不破坏任何东西的情况下自由创建和传播它们。(另见最近关于他们没有"身份"的讨论。(
新定义明确表示,prvalue是"等待发生"的初始化:一旦为其识别了目标对象,它就是被初始化的对象。(需要注意的是,当构建prvalue时,初始化仍然会发生,而不是所在的。(这被称为"强制复制省略",基于已经很常见的等效优化。
至于这个例子,人们认为新的价值类别定义要简单得多,因此需要更少的例子。xvalues(这是最微妙的类别(仍然有一个。
- 特征版本 3.2.0 和 3.3.4 之间的数值差异
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- 检测到 Conan 配置文件设置与 CMake 之间的编译器版本不匹配
- 为什么C++中的表达式类型在不同版本之间会发生变化
- 为什么CRC计算在C和C 版本之间有所不同
- 两个提升版本之间的冲突
- .vcxproj 和 .vcxproj.filters 中的工具版本之间的差异
- boost::v1.59 和 v1.60 之间的序列化存档版本
- g++-8 和早期版本之间的奇怪行为
- 如何在两个版本之间从perforce差异获取C/C 函数名称
- 具有C 接口的C 动态库如何在不同的编译器版本之间不会破坏ABI
- GLIBCXX(libstdc++.so.6)与gcc版本之间的关系
- 游戏"Life"中发布和调试版本之间的加速比例奇怪
- 最新版本的提升和提升几何库 (GGL) 之间的冲突
- 是否可以有一个零成本assert(),这样代码就不必在调试和发布版本之间进行修改
- 如何在不同的MS Office版本之间进行C 应用程序切换
- 如何在本机C++(Windows 7及以前版本)和通用C++(Windows 8及以后版本)应用程序之间共享代码
- 版本之间定义的实现
- C++版本之间的差异
- 调试版本和发布版本之间可能出现的差异