Unique's Blog

C++值的类型

2022-04-10 · 521字 · 2 min read
🏷️  C++

C++值的类型说明

C++表达式(操作符表达式,字面量,变量名等)都有值类型,通常将值的类型划分为左值和右值:

  • 一个表达式,如果能对它进行取地址运算/确定的内存地址,则它是左值;(包括左值的引用)
  • 否则,它就是右值

C++11后出现了5种值的类型,简单解释:

  • glvalue 广义左值,(运算结果)是具有身份/内存地址的对象/函数的表达式,包括xvaluelvalue
  • xvalue 即将过期值/亡值,属于glvalue广义左值,表示其资源可以被重复使用/移动的对象
    • 返回类型是右值引用的函数调用,如std::move(x);
    • a[n],a.m,a.*mp表达式(其中a是rvalue,m是非引用类型的非静态成员,mp是指针)
    • 转换为对象类型的右值引用的cast表达式,如static_cast<int&&>(x)
  • lvalue 历史上叫法(可以出现在赋值运算符的左边),属于glvalue但不是xvalue
  • prvalue 纯右值,例如字面量(字符串除外)、算术表达式(a+b, &a, 后置加加等)、临时对象、lamda表达式等。
  • rvalue 历史叫法(可以出现在赋值运算符的右边),包括prvaluexvalue

可以将值大概分为3种:

  • xvalue 广义左值,但是其资源可以重复使用/移动【有身份,可以移动】
  • lvalue 传统左值,资源不能移动【有身份,不可以移动】
  • prvalue 传统右值,资源可以移动【没有身份,可以移动】

在C++中右值rvalue的语义就是可移动的。
只需要记住特殊的广义左值xvalue,它是有身份的但是其资源可以移动,常见情形:

// 1. 返回右值引用的函数调用
std::move(x);
func(); //func的声明:Foo&& func();

// 2. 转换为右值引用的cast
static_cast<int&&>(x);

// 3. rvalue的成员
std::move(x).m_data; // 非引用类型的非静态成员
func().m_data;  //func的声明:Foo&& func();
static_cast<Foo&&>(x).m_data;

本文链接: C++值的类型

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

发布日期: 2022-04-10

最新构建: 2024-12-26

本文已被阅读 0 次,该数据仅供参考

欢迎任何与文章内容相关并保持尊重的评论😊 !

共 43 篇文章 | Powered by Gridea | RSS
©2020-2024 Nuo. All rights reserved.