C++学习实践(三)c++11新特性常见问题(附详细答案)

本文探讨了C++11中的auto类型推导,包括其使用限制和注意事项,如必须初始化、不能用于函数参数等。同时,介绍了右值引用的概念,如左值和右值的区别,移动语义的效率优势,以及完美转发在函数模板中的应用,强调了std::forward在保持参数属性不变中的作用。

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

1、auto类型推导

(1)auto的使⽤必须⻢上初始化,否则⽆法推导出类型
(2)auto在⼀⾏定义多个变量时,各个变量的推导不能产⽣⼆义性,否则编译失败。
(3)auto不能⽤作函数参数
(4)在类中auto不能⽤作⾮静态成员变量
(5)auto不能定义数组,可以定义指针
(6)auto⽆法推导出模板参数

(7)在不声明为引⽤或指针时,auto会忽略等号右边的引⽤类型和cv限定。
(8)在声明为引⽤或者指针时,auto会保留等号右边的引⽤和cv属性。cv是指const 和volatile

const int a = 3;
auto pp = a;	//int
auto* ppp = &a;	//const int*
auto& p = a;	//const int&

2、右值引用、完美转发

(1)左值、右值
左值: 可以放在等号左边,可以取地址并由名字。
右值: 不可以放在等号左边,不能取地址,没有名字。
将亡值: 即将要销毁的值,通过“盗取”其它变量内存空间⽅式获取的值,在确保其它变量即将被销毁时,可以避免内存空间的释放和分配,延⻓变量值的⽣命周期,常⽤于移动构造或者移动赋值。

参考链接

(2)左值/右值引用
左值引用: 对左值进⾏引⽤的类型,是对象的⼀个别名。

右值引用: 引用通常不能绑定到任何的左值,要想绑定一个左值到右值引用,通常需要std::move()将左值强制转换为右值,例如:

int a;
int &&r1 = c;             # 编译失败
int &&r2 = std::move(a);  # 编译通过

(3)移动语义
直接使用源对象拥有的资源,可以 节省资源申请和释放的时间。

通过移动构造函数使⽤移动语义,也就是std::move;移动语义仅针对于那些实现了移动构造函数的类的对象,对于那种基本类型int、float等没有任何优化作⽤,还是会拷⻉,因为它们实现没有对应的移动构造函数。

move()函数:将左值转换为右值,实现对象资源的转移。
(4)完美转发
写⼀个接受任意实参的函数模板,并转发到其它函数,⽬标函数会收到与转发函数完全相同的实参(参数的值,还能保证被转发参数的左、右值属性不变。),通过std::forward(参数)实现。

参考链接

侵权联系删,持续更新中~

如果你对自动驾驶预测规划决策控制学习规划、科研方向、求职感兴趣,欢迎咸鱼搜索“技术咨询小店”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执着且专注

予人玫瑰,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值