什么是右值,左值,x值,glvalues和prvalues?

什么是右值,左值,x值,glvalues和prvalues?

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

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

  1. 右值

  2. 左值

  3. x值

  4. glvalue

  5. prvalue

两类已成为五大类。

  • 这些新的表达类别是什么?

  • 这些新类别如何与现有的左值和左值类别相关联?

  • C ++ 0x中的右值和左值类别是否与它们在C ++ 03中的相同?

  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?


浮云间
浏览 1012回答 3
3回答

当年话下

这些新的表达类别是什么?的FCD(n3092)具有优异的描述:- 左值(所谓的历史,因为左值可能出现在赋值表达式的左侧)指定一个函数或一个对象。[示例:如果E是指针类型的表达式,则* E是指向E指向的对象或函数的左值表达式。另一个例子,调用返回类型为左值引用的函数的结果是左值。 - 末端的例子]- xvalue(“eXpiring”值)也指对象,通常接近其生命周期的末尾(例如,可以移动其资源)。xvalue是涉及rvalue引用的某些表达式的结果(8.3.2)。[示例:调用返回类型为右值引用的函数的结果是xvalue。 - 末端的例子]- glvalue(“广义”左值)是左值或x值。- rvalue(历史上所谓的,因为rvalues可能出现在赋值表达式的右侧)是xvalue,临时对象(12.2)或其子对象,或者是与对象无关的值。- prvalue(“纯”rvalue)是一个不是xvalue的rvalue。[示例:调用返回类型不是引用的函数的结果是prvalue。诸如12,7.3e5或true之类的文字的值也是prvalue。 - 末端的例子]每个表达式都属于此分类法中的基本分类之一:lvalue,xvalue或prvalue。表达式的此属性称为其值类别。[注意:第5章中对每个内置运算符的讨论表明了它产生的值的类别以及它所期望的操作数的值类别。例如,内置赋值运算符期望左操作数是左值,右操作数是prvalue并产生左值作为结果。用户定义的运算符是函数,它们期望和产生的值的类别由它们的参数和返回类型决定。 - 注意我建议你阅读3.10 Lvalues和rvalues的整个部分。这些新类别如何与现有的左值和左值类别相关联?再次:C ++ 0x中的右值和左值类别是否与它们在C ++ 03中的相同?rvalues的语义特别随着移动语义的引入而发展。为什么需要这些新类别?因此可以定义和支持移动构造/分配。

四季花海

我将从你的上一个问题开始:为什么需要这些新类别?C ++标准包含许多处理表达式的值类别的规则。一些规则区分左值和右值。例如,当涉及到重载决策时。其他规则区分glvalue和prvalue。例如,您可以使用不完整或抽象类型的glvalue,但没有不完整或抽象类型的prvalue。在我们使用这个术语之前,实际需要区分glvalue / prvalue的规则是指lvalue / rvalue和它们无意中是错误的还是包含了很多解释和例外的规则......“除非rvalue是由于未命名右值参考......“。因此,将glvalues和prvalues的概念作为自己的名称似乎是一个好主意。这些新的表达类别是什么?这些新类别如何与现有的左值和左值类别相关联?我们仍然有与C ++ 98兼容的术语lvalue和rvalue。我们只是将rvalues分成两个子组,xvalues和prvalues,我们将lvalues和xvalues称为glvalues。Xvalues是未命名的右值引用的一种新值类别。每个表达式都是以下三个中的一个:左值,右值,右值。维恩图看起来像这样:    ______ ______   /      X      \  /      / \      \ |   l  | x |  pr  |  \      \ /      /   \______X______/       gl    r功能示例:int   prvalue();int&  lvalue();int&& xvalue();但也不要忘记命名的右值引用是左值:void foo(int&& t) {  // t is initialized with an rvalue expression  // but is actually an lvalue expression itself}
打开App,查看更多内容
随时随地看视频慕课网APP