Update item2.md

This commit is contained in:
猫耳堀川雷鼓 2021-03-16 10:30:16 +08:00 committed by GitHub
parent 750cb03e33
commit 3002675f67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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
````