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

标签 c++ c++11 c++14 c++17 c++20

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

下面我引用以下草案:

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

C++11 3.10 Lvalues and rvalues

... A prvalue (“pure” rvalue) is an rvalue that is not an xvalue. [ Example: The result of calling a function whose return type is not a reference is a prvalue. The value of a literal such as 12, 7.3e5, or true is also a prvalue. — end example ]

C++17 3.10 Lvalues and rvalues

... A prvalue is an expression whose evaluation initializes an object or a bit-field, or computes the value of the operand of an operator, as specified by the context in which it appears.

C++20 7.2.1 Value categories*

... A prvalue is an expression whose evaluation initializes an object or a bit-field, or computes the value of an operand of an operator, as specified by the context in which it appears, or an expression that has type cv void.

我会理解措辞的变化,并做出一些调整,但对我来说整个定义发生了变化。有人可以帮助我理解这一点吗?例如,为什么删除“纯右值是不是 xvalue 的右值”这句话?或者为什么有用的示例被删除了?

最佳答案

最初的纯右值定义只是一个标签:我们保留某些右值(即那些不是 xvalues 的右值)并给它们一个名称。除非通过不寻常的 this 用法(或多或少是因为它们是临时的),否则不可能获取它们的地址,因此可以在不破坏任何内容的情况下对其创建和传播进行某些自由。 (另请参阅 recent discussion 其中不“具有身份”。)

新定义明确指出纯右值是“等待发生”的初始化:一旦为其识别了目标对象,它就会被初始化。 (需要注意的是,初始化仍然在构造纯右值时发生,而不是在它所在的位置。)这就是基于“强制复制省略”的名称等效的优化已经很常见。

就示例而言,新的值类别定义被认为更加简单,因此需要的示例更少。还有一个用于 xvalues(这是最微妙的类别)。

关于c++ - 为什么 C++ 中的表达式类型在不同版本之间发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58636380/

相关文章:

c++ - 如何在 C++11 的模板中只接受数字和字符串?

c++ - 如何使用迭代器格式实现快速排序?

C++0x 3d map 像 php 关联数组一样初始化

c++ - 为什么operator new不能构造非常量大小的多维数组?

c++ - 在派生类的析构函数中抛出异常

c++ - Boost.花 : How to check if function has specialisation for a certain type?

c++ - 为什么自动不检测函数的引用类型

c++ - SFINAE 和模板函数实例化 : Why a template argument cannot be deduced when used in function arguments with a SFINAE-enabled type?

C++ 使用带任务列表的命令提示符扫描进程 ID

c++ - 使用 std::regex_match 匹配单个数字