mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-26 01:00:36 +08:00
Update item2.md
This commit is contained in:
parent
750cb03e33
commit
3002675f67
@ -94,7 +94,7 @@ auto& func2 = someFunc; //func2的类型是void (&)(int, double)
|
||||
````
|
||||
就像你看到的那样,`auto`类型推导和模板类型推导几乎一样的工作,它们就像一个硬币的两面。
|
||||
|
||||
讨论完相同点接下来就是不同点,前面我们已经说到auto类型推导和模板类型推导有一个例外使得它们的工作方式不同,接下来我们要讨论的就是那个例外。
|
||||
讨论完相同点接下来就是不同点,前面我们已经说到`auto`类型推导和模板类型推导有一个例外使得它们的工作方式不同,接下来我们要讨论的就是那个例外。
|
||||
我们从一个简单的例子开始,如果你想声明一个带有初始值27的`int`,C++98提供两种语法选择:
|
||||
|
||||
````cpp
|
||||
@ -123,7 +123,7 @@ auto x3 = { 27 }; //类型是std::initializer_list<int>,
|
||||
//值是{ 27 }
|
||||
auto x4{ 27 }; //同上
|
||||
````
|
||||
这就造成了auto类型推导不同于模板类型推导的特殊情况。当用`auto`声明的变量使用花括号进行初始化,auto类型推导推出的类型则为`std::initializer_list`。如果这样的一个类型不能被成功推导(比如花括号里面包含的是不同类型的变量),编译器会拒绝这样的代码:
|
||||
这就造成了`auto`类型推导不同于模板类型推导的特殊情况。当用`auto`声明的变量使用花括号进行初始化,`auto`类型推导推出的类型则为`std::initializer_list`。如果这样的一个类型不能被成功推导(比如花括号里面包含的是不同类型的变量),编译器会拒绝这样的代码:
|
||||
````cpp
|
||||
auto x5 = { 1, 2, 3.0 }; //错误!无法推导std::initializer_list<T>中的T
|
||||
````
|
||||
|
Loading…
Reference in New Issue
Block a user