什么是右值、左值、X值、GL值和PR值?

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

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

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

两类变成了五类

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

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

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

根据草稿,我猜r/l值的区别保持不变,只是在移动的东西变得混乱的情况下

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

引用n3055:

  • 左值(历史上所谓的,
    因为左值可能会出现在
    作业的左边
    表达式)指定函数或
    物体[示例:如果E
    指针类型的表达式,然后是*E
    是指的左值表达式
    E
    另一个例子是
    调用其
    返回类型是一个左值引用
    左值。]
  • 一个xvalue(一个
    “到期”值)也指
    对象,通常在其
    生命周期(以便其资源
    例如,被移动)。xvalue是
    某些类型的错误的结果
    涉及右值的表达式
    参考资料[示例:
    调用其
    返回类型是一个右值引用
    一个X值。]
  • glvalue(“广义”左值)是一个左值
    xvalue

  • 一个右值(所谓,
    历史上,因为右值可以
    显示在屏幕的右侧
    赋值表达式)是一个xvalue,
    临时物品或临时物品
    其子对象,或
    不与对象关联

  • A
    prvalue(“纯”右值)是右值
    这不是一个xvalue[示例:
    调用其
    返回类型不是一个引用,而是一个
    prvalue]

该文件是该问题的重要参考资料,因为它显示了新术语引入后标准发生的确切变化

发表评论