都是自己选择的语言,一条道走到黑。
被问到这样的一个问题😂。
在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
网友评论