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 包括:
- 变量、函数或数据成员的名字
- 返回左值引用的表达式,如
++x
、x = 1
、cout << ' '
- 字符串字面量如
"hello world"
prvalue 包括:
- 返回非引用类型的表达式,如
x++
、x + 1
、make_shared<int>(42)
- 除字符串字面量之外的字面量,如
42
、true
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 绑定到引用上,它的生命周期则会延长到跟这个引用变量一样长
本文来自博客园,作者:路过的摸鱼侠,转载请注明原文链接:https://www.cnblogs.com/ljx-null/p/15929326.html