Bootstrap

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

参考链接

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

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

;