gpt4 book ai didi

c++ - 什么是 rvalues、lvalues、xvalues、glvalues 和 prvalues?

转载 作者:bug小助手 更新时间:2023-10-28 01:30:03 34 4
gpt4 key购买 nike

在 C++03 中,表达式可以是 rvaluelvalue

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

  1. 右值
  2. 左值
  3. xvalue
  4. glvalue
  5. prvalue

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

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

最佳答案

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

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

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

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

引用 n3055 :

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

有问题的文档是这个问题的一个很好的引用,因为它显示了由于引入新命名法而发生的标准的确切变化。

关于c++ - 什么是 rvalues、lvalues、xvalues、glvalues 和 prvalues?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3601602/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com