c++ - 什么是右值、左值、x值、左值和右值?

标签 c++ expression c++-faq c++11

在 C++03 中,表达式可以是右值,也可以是左值

在 C++11 中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. gl值
  5. 右值

两个类别变成了五个类别。

  • 这些新的表达类别是什么?
  • 这些新类别与现有的右值和左值类别有何关系?
  • C++0x 中的右值和左值类别与 C++03 中的相同吗?
  • 为什么需要这些新类别?是WG21众神只是想迷惑我们凡人?

最佳答案

我想这个文档可以作为一个不那么简短的介绍:n3055

整个屠杀是从移动语义开始的。一旦我们有了可以移动而不可以复制的表达式,突然之间,易于掌握的规则就需要区分可以移动的表达式以及向哪个方向移动。

根据我对草案的猜测,r/l 值的区别保持不变,只是在移动事物变得困惑的情况下。

他们需要吗?如果我们想放弃新功能,则可能不会。但为了实现更好的优化,我们可能应该拥抱它们。

引用n3055 :

  • 左值(所谓的,历史上, 因为左值可能出现在 作业的左侧 表达式)指定一个函数或 一个东西。 [示例:如果 E 是 指针类型的表达式,然后 *E 是一个左值表达式,指的是 E 的对象或函数 点。作为另一个例子, 调用函数的结果 返回类型是左值引用 左值。]
  • xvalue(一个 “即将到期”值)也指 物体,通常接近其末端 生命周期(以便其资源可以 例如,被移动)。 x 值是 某些类型的结果 涉及右值的表达式 引用。 [示例: 调用函数的结果 返回类型是右值引用 x 值。]
  • glvalue(“广义”左值)是一个左值xvalue
  • 右值(所谓的, 从历史上看,因为右值可以 出现在 赋值表达式)是一个 xvalue, 临时对象或 其子对象,或者是一个值 不与对象关联。
  • A prvalue(“纯”右值)是一个右值 这不是 x 值。 [示例: 调用函数的结果 返回类型不是引用而是a 右值]

所讨论的文档对于这个问题来说是一个很好的引用,因为它显示了由于引入新术语而导致的标准的确切变化。

关于c++ - 什么是右值、左值、x值、左值和右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61899123/

相关文章:

c++ - 使用 vector 时出现奇怪的运行时错误

c++ - 如何阅读涉及模板的 C++ 错误

c++ - 在visual studio中,在c++项目的项目属性中,引用窗口是什么?

java - 要根据输入数字本身评估的两个数字的 GCD/LCM

c# - 使用反射创建 lambda 表达式,如 x => new { .. }

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 无效的显式参数

c# - 添加两个表达式以在 Entity Framework Core 3 中创建谓词不起作用

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - cout << a++ << a; 的正确答案是什么?