C++值的分类 —— 摘自维基百科

本文详细介绍了C++11中值的五种分类:基础值类型、左值、临终值、纯右值及广义左值,并阐述了它们的特性与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++11,对于值的分类,要考虑标识(identity)与可移动性(movability),二者的组合产生了五种分类:
  • 基础值类型
    • 左值lvalue:可以用取地址运算符&获取地址的表达式。也可定义为非临时对象或非成员函数。具有标识,但不可移动。这也是C++03的经典左值。可用于初始化左值引用。可以有不完备类型(incomplete type)。包括:
      • 作用域中的变量名与函数名,不论其类型。因此,具名的右值引用,即具有右值引用类型的变量,也是左值表达式,这符合一般规律,不是特例。
      • 函数调用表达式或重载运算符表达式,如果其返回类型为左值引用。
      • 内建的先增(前缀++)、先减(前缀--)、解引用(dereference)、赋值、复合赋值、下标(除了数组临终值)、成员访问(除了临终值的非静态非引用成员、成员枚举值、非静态成员函数),通过数据成员指针的访问且左端操作数为左值、逗号运算符且右端的操作数为左值、三元条件运算符(ternary conditional)且第二与第三操作数为左值。
      • 到左值引用类型的类型转换表达式。
      • 字符串字面量(string literal)
      • 函数调用表达式如果函数返回类型为到函数类型的右值引用
      • 类型转换表达式,转换为到函数的右值引用
    • 临终值xvalue(expiring value):具有标识,并且可以移动。对应的对象接近生存期结束,但其内容尚未被移走。可以多态;非类对象可以cv限定。包括:
      • 函数调用或重载的运算符表达式,如果返回类型是右值引用
      • 类型转换表达式,转换为右值引用,如static_cast<T&&>(val)或(T&&)val
      • 访问xvalue的非静态类成员。
      • 指向数据成员的指针表达式,第一操作数是xvalue
    • 纯右值prvalue:不具有标识,但可以移动。对应临时对象或不对应任何对象的值。纯右值不能是多态的;临时对象的动态类型是表达式类型;非类且非数组的纯右值不能是const限定的;不能有不完备类型(除了void)。包括:
      • 字面量(除了字符串字面量)。
      • 函数调用或重载的运算符表达式,如果返回类型不是引用。
      • 内建后增、后减、算术与逻辑运算符、比较运算符、取地址运算符、访问成员枚举值、访问非静态成员函数、访问右值的非静态非引用数据成员、访问右值的数据成员指针或非静态函数成员指针、逗号运算符且右端操作数为右值、三元条件运算符且第二或第三操作数不是左值。
      • 类型转换表达式,转换为非引用类型。
      • Lambda表达式
  • 广义左值glvalue:具有标识。包括左值与临终值。可以多态、动态类型。
  • 右值rvalue:可以移动。包括濒死值与纯右值。不能通过&运算符取地址。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值