mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-27 12:21:01 +08:00
commit
c347bd0e40
@ -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**,它会告诉你如何让编译器这么做。
|
||||
|
||||
记住:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user