auto类型推断

2022-03-19  本文已影响0人  九楼记

都是自己选择的语言,一条道走到黑。

被问到这样的一个问题😂。

在C++11中,支持统一初始化(uniform initialization):

auto x1 = 27;
 auto x2(27);
 auto x3 = {27};
 auto x4{27}; 

上面的四句话都能编译通过,但并没有和原来的四种形式意义完全一致。前面两个是一样的,后面两句话声明的变量类型是std::initializer_list,其中包含了单个元素,值为27。

 auto x1 = 27; //x1为int,值为27
 auto x2(27);//同上
 auto x3 = {27};//x3为 std::initializer_list<int>,值为{27}
 auto x4{27}; //同上

这里就用到了一个对于auto的特殊类型推断规则:当用大括号括起来的值对auto变量进行初始化的时候(叫做统一初始化式),变量类型会被推断为 std::initializer_list。如果不能够推断成此类型(比如,大括号中的值不是同一类型),编译会出错:

auto x5 = { 1, 2, 3.0 }; // error! 类型不一致,不能将推断为std::initializer_list<T>

这里会发生两种类型推断,一种是将统一初始化式推断为std::initializer_list ,而std::initializer_list本身也是一个类型为T的模板,因此会根据统一初始化式中的实参对T进行模板类型推断,这是第二种类型推断。上面的类型推断会失败是因为第二种类型推断会失败。

reference

[1] https://www.cnblogs.com/harlanc/p/10628321.html
[2] https://developer.aliyun.com/article/696066

上一篇下一篇

猜你喜欢

热点阅读