C++ 左值和右值

C++ 左值和右值

C++中值有两个独立的属性

  • 有身份(has identity):或者说,有地址,有指向它的指针
    • 有身份的值统称为 glvalue (“generalized” lvalue)
  • 可以被移动(can be moved from)
    • 可以移动的值统称为 rvalue

因此可以将值分为三种类型(大写表示没有这种属性)

  • iM
    • 有身份,且不能被移动
    • lvalue
  • im
    • 有身份,且可以被移动
    • 比如,将左值转换为右值引用的结果
    • xvalue(an “eXpiring” value)
  • Im
    • 没有身份,可以被移动
    • prvalue(“pure” rvalue)

第四种类型 IM 在 C++中没有被使用

lvalue 包括:

  • 变量、函数或数据成员的名字
  • 返回左值引用的表达式,如 ++xx = 1cout << ' '
  • 字符串字面量如 "hello world"

prvalue 包括:

  • 返回非引用类型的表达式,如 x++x + 1make_shared<int>(42)
  • 除字符串字面量之外的字面量,如 42true

xvalue 包括:

  • 函数调用或重载运算符,右值引用类型的返回值,比如 std::move(x)
smart_ptr<shape> ptr1{new circle()};
smart_ptr<shape> ptr2 = std::move(ptr1);

new circle() 是一个 prvalue,而 std::move(ptr1),等价于 static_cast<smart_ptr<shape>&&>(ptr1),它是一个 xvalue

特别地,如果将某个 prvalue 绑定到引用上,它的生命周期则会延长到跟这个引用变量一样长

posted @ 2022-02-23 21:39  路过的摸鱼侠  阅读(156)  评论(0编辑  收藏  举报