Merge pull request #15 from pusidun/ch1fix

amend item1
This commit is contained in:
kelthuzadx 2020-01-14 18:09:32 +08:00 committed by GitHub
commit c347bd0e40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -35,9 +35,9 @@ f(x); //用一个int类型的变量调用f
````
T被推导为**int**ParamType却被推导为**const int&**
我们可能很自然的期望T和传递进函数的参数是相同的类型在上面的例子中事实就是那样**x**是**int**T是**expr**的类型即**int*。但有时情况并非总是如此T的推导不仅取决于**expr**的类型,也取决于**ParamType**的类型。这里有三种情况:
我们可能很自然的期望T和传递进函数的参数是相同的类型在上面的例子中事实就是那样**x**是**int**T是**expr**的类型即**int**。但有时情况并非总是如此T的推导不仅取决于**expr**的类型,也取决于**ParamType**的类型。这里有三种情况:
+ ParamType是一个指针或引用但不是通用引用关于通用引用请参见Item24。在这里你只需要知道它存在而且不同于左值引用和右值引用
+ ParamType是一个指针或引用但不是通用引用关于通用引用请参见Item24。在这里你只需要知道它存在而且不同于左值引用和右值引用
+ ParamType一个通用引用
+ ParamType既不是指针也不是引用
@ -132,7 +132,7 @@ f(rx); //T和param都是int
认识到只有在传值给形参时才会忽略常量性和易变性这一点很重要正如我们看到的对于形参来说指向const的指针或者指向const的引用在类型推导时const都会被保留。但是考虑这样的情况expr是一个const指针指向const对象expr通过传值传递给**param**
````cpp
template<typoename T>
template<typename T>
void f(T param); //传值
const char* const ptr = //ptr是一个常量指针指向常量对象
@ -221,7 +221,7 @@ f2(someFunc); //param被推导为指向函数的引用类型为void(&)(int,
````
这个实际上没有什么不同,但是如果你知道数组退化为指针,你也会知道函数退化为指针。
这里你需要知道:**auto**依赖于模板类型推导,正如我在开始谈论的,在大多数情况下它们的行为很直接。在通用引用中对于左值的特殊处理使得本来很直接的行为变得有些污点,然而,数组和函数退化为指针把这团水搅得更浑浊。
这里你需要知道:**auto**依赖于模板类型推导,正如我在开始谈论的,在大多数情况下它们的行为很直接。在通用引用中对于左值的特殊处理使得本来很直接的行为变得有些污点,然而,数组和函数退化为指针把这团水搅得更浑浊。有时你只需要编译器告诉你推导出的类型是什么。这种情况下,翻到**item4**,它会告诉你如何让编译器这么做。
记住: