C++学习实践(三)c++11新特性常见问题(附详细答案)
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(参数)实现。
侵权联系删,持续更新中~
如果你对自动驾驶预测规划决策控制学习规划、科研方向、求职感兴趣,欢迎咸鱼搜索“技术咨询小店”。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!