gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:09 33 4
gpt4 key购买 nike

在 C++03 中,表达式要么是右值,要么是左值

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

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

两类变成了五类。

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

最佳答案

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

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

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

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

引用 n3055 :

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

有问题的文档是这个问题的重要引用,因为它显示了由于引入新术语而导致的标准变化。

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

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