mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-27 04:10:30 +08:00
a small fix
This commit is contained in:
parent
5fd6bc9852
commit
b9eb8710fe
@ -117,15 +117,15 @@ auto x4{ 27 };
|
||||
````
|
||||
这些声明都能通过编译,但是他们不像替换之前那样有相同的意义。前面两个语句确实声明了一个类型为`int`值为27的变量,但是后面两个声明了一个存储一个元素27的 `std::initializer_list<int>`类型的变量。
|
||||
````cpp
|
||||
auto x1=27; //类型是int,值是27
|
||||
auto x1 = 27; //类型是int,值是27
|
||||
auto x2(27); //同上
|
||||
auto x3={27}; //类型是std::initializer_list<int>,
|
||||
auto x3 = { 27 }; //类型是std::initializer_list<int>,
|
||||
//值是{ 27 }
|
||||
auto x4{27}; //同上
|
||||
auto x4{ 27 }; //同上
|
||||
````
|
||||
这就造成了auto类型推导不同于模板类型推导的特殊情况。当用`auto`声明的变量使用花括号进行初始化,auto类型推导推出的类型则为`std::initializer_list`。如果这样的一个类型不能被成功推导(比如花括号里面包含的是不同类型的变量),编译器会拒绝这样的代码:
|
||||
````cpp
|
||||
auto x5={1,2,3.0}; //错误!无法推导std::initializer_list<T>中的T
|
||||
auto x5 = { 1, 2, 3.0 }; //错误!无法推导std::initializer_list<T>中的T
|
||||
````
|
||||
就像注释说的那样,在这种情况下类型推导将会失败,但是对我们来说认识到这里确实发生了两种类型推导是很重要的。一种是由于`auto`的使用:`x5`的类型不得不被推导。因为`x5`使用花括号的方式进行初始化,`x5`必须被推导为`std::initializer_list`。但是`std::initializer_list`是一个模板。`std::initializer_list<T>`会被某种类型`T`实例化,所以这意味着`T`也会被推导。 推导落入了这里发生的第二种类型推导——模板类型推导的范围。在这个例子中推导之所以失败,是因为在花括号中的值并不是同一种类型。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user