C++11新特性之auto和decltype知识点
C++11引入了auto和decltype关键字,使用它们可以在编译期就推导出变量或者表达式的类型,方便开发者编码的同时也简化了代码。
auto
auto可以让编译器在编译器就推导出变量的类型,看代码:
1 | auto a = 10; // 10是int型,可以自动推导出a是int |
这就是auto的基本用法,可以通过等号=
右边的类型推导出变量的类型。
auto推导规则
直接看代码
代码1:
1 | int i = 10; |
代码2:
1 | void func(auto value) {} // error,auto不能用作函数参数 |
auto的限制:
- auto的使用必须马上初始化,否则无法推导出类型
- auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败
- auto不能用作函数参数
- 在类中auto不能用作非静态成员变量
- auto不能定义数组,可以定义指针
- auto无法推导出模板参数
再看这段代码:
1 | int i = 0; |
首先,介绍下,这里的cv
是指const
和volatile
推导规则
- 在不声明为引用或指针时,auto会忽略等号右边的引用类型和cv限定
- 在声明为引用或者指针时,auto会保留等号右边的引用和cv属性
什么时候使用auto?
这里没有绝对答案,在不影响代码代码可读性的前提下尽可能使用auto是蛮好的,复杂类型就使用auto,int、double这种就没有必要使用auto了,看下面这段代码:
1 | auto func = [&] { |
decltype
上面介绍auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算,上代码:
1 | int func() { return 0; } |
注意:
decltype不会像auto一样忽略引用和cv属性,decltype会保留表达式的引用和cv属性
1 | cont int &i = 1; |
decltype推导规则
对于decltype(exp)有
- exp是表达式,decltype(exp)和exp类型相同
- exp是函数调用,decltype(exp)和函数返回值类型相同
- 其它情况,若exp是左值,decltype(exp)是exp类型的左值引用
1 | int a = 0, b = 0; |
auto和decltype的配合使用
auto和decltype一般配合使用在推导函数返回值的类型问题上。
下面这段代码
1 | template<typename T, typename U> |
上面代码由于t和u类型不确定,那如何推导出返回值类型呢,可能会想到这种
1 | template<typename T, typename U> |
这段代码在C++11上是编译不过的,因为在decltype(t +u)推导时,t和u尚未定义,就会编译出错,所以有了下面的叫做返回类型后置的配合使用方法:
1 | template<typename T, typename U> |
返回值后置类型语法就是为了解决函数返回值类型依赖于参数但却难以确定返回值类型的问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 竹山一叶!
评论