C++左值、将亡值、右值、左值引用、右值引用、完美转发

C++左值、将亡值、右值、左值引用、右值引用、完美转发

左值

具有可访问地址(具名变量)。
示例包括:变量名称,包括变量 const 、数组元素、返回 lvalue 引用的函数调用、位字段、结构体和类成员。

将亡值(特殊的右值)

表达式的地址不能再由程序访问(临近生存期),但可重复使用其资源的对象,用它来初始化具名变量,将会延长它的生存期。
示例包括:返回右值引用的函数调用,以及数组下标、成员和指针到数组或对象为右值引用的成员表达式。

右值

没有通过程序访问的地址(不具名变量),当前语句过后,成为将亡值。
示例包括:文本、返回非引用类型的函数调用,以及在表达式评估期间创建但仅由编译器访问的临时对象。

左值引用

视为对象的另一名称,引用必须初始化且无法更改,与原对象使用同一块空间。

右值引用

右值引用支持 移动语义 的实现,这可以显著提高应用程序的性能。
右值在当前语句执行过后就会将亡,但是我们使用右值引用作为参数接收将亡值,我们就可以在延长将亡值的生存期

完美转发

std::forward<Type>(arg)
如果在 arg 中传递的值最初为右值或对右值的引用,则返回对 arg 的右值引用;否则,将返回 Arg 而不修改其类型

#include <iostream>

using namespace std;

void Test2(int &&a) {
    cout << "R" << endl;
}

void Test2(int &a) {
    cout << "L" << endl;
}

void Test1(int &&a) {
    Test2(a);
    Test2(forward<int>(a));
}

int main() {
    Test1(1);
}

运行结果:

L
R

1是右值,a是右值引用,但是在Test2参数传递过程中,a被编译器推断为左值,所以第一个Test2(int &a),输出L
但是使用forward函数后,返回a的右值引用,所以Test2(int &&a),输出R

注:右值引用会被编译器当作左值使用,需要使用forward来保留值原来的语义。
还有一个函数是move,作用是把左值返回右值引用,右值返回左值引用

微软官方文档

官方文档看完还是不太理解,所以自己参照其他博客和文档加上自己的理解,总结一下。
左值与右值
可通过上边链接找到以上所有相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值