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

2024-01-01 21:32:13

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(参数)实现。

参考链接

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

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

文章来源:https://blog.csdn.net/qq_41667348/article/details/135227242
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。