mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-04-04 00:21:02 +08:00
item3: suppress extra emphasis by adding space chars
This commit is contained in:
parent
2d9ae59c29
commit
e28ac91b39
@ -31,7 +31,7 @@ if(v[0]==0) //decltype(v[0])是int&
|
||||
|
||||
对一个T类型的容器使用**operator[]** 通常会返回一个T&对象,比如**std::deque**就是这样,但是**std::vector**有一个例外,对于**std::vector<bool>**,**operator[]**不会返回**bool&**,它会返回一个有名字的对象类型(译注:MSVC的STL实现中返回的是**std::_Vb_reference<std::_Wrap_alloc<std::allocator<unsigned int>>>**)。关于这个问题的详细讨论请参见Item6,这里重要的是我们可以看到对一个容器进行**operator[]**操作返回的类型取决于容器本身。
|
||||
|
||||
使用**decltype**使得我们很容易去实现它,这是我们写的第一个版本,使用*decltype**计算返回类型,这个模板需要改良,我们把这个推迟到后面:
|
||||
使用**decltype**使得我们很容易去实现它,这是我们写的第一个版本,使用**decltype**计算返回类型,这个模板需要改良,我们把这个推迟到后面:
|
||||
````cpp
|
||||
template<typename Container,typename Index>
|
||||
auto authAndAccess(Container& c,Index i)
|
||||
@ -41,6 +41,7 @@ auto authAndAccess(Container& c,Index i)
|
||||
return c[i];
|
||||
}
|
||||
````
|
||||
|
||||
函数名称前面的**auto**不会做任何的类型推导工作。相反的,他只是暗示使用了C++11的尾置返回类型语法,即在函数形参列表后面使用一个**->** 符号指出函数的返回类型,尾置返回类型的好处是我们可以在函数返回类型中使用函数参数相关的信息。在**authAndAccess**函数中,我们指定返回类型使用c和i。如果我们按照传统语法把函数返回类型放在函数名称之前, c和i就未被声明所以不能使用。
|
||||
|
||||
在这种声明中,**authAndAccess**函数返回**operator[]** 应用到容器中返回的对象的类型,这也正是我们期望的结果。
|
||||
@ -54,7 +55,7 @@ auto authAndAccess(Container& c,Index i)
|
||||
return c[i];
|
||||
}
|
||||
````
|
||||
Item2解释了函数返回类型中使用**auto**编译器实际上是使用的模板类型推导的那套规则。如果那样的话就会这里就会有一些问题,正如我们之前讨论的,**operator[]**对于大多数T类型的容器会返回一个**T&**,但是Item1解释了在模板类型推导期间,如果表达式是一个引用那么引用会被忽略。基于这样的规则,考虑它会对下面用户的代码有哪些影响:
|
||||
Item2解释了函数返回类型中使用**auto**编译器实际上是使用的模板类型推导的那套规则。如果那样的话就会这里就会有一些问题,正如我们之前讨论的,**operator[]** 对于大多数T类型的容器会返回一个**T&** ,但是Item1解释了在模板类型推导期间,如果表达式是一个引用那么引用会被忽略。基于这样的规则,考虑它会对下面用户的代码有哪些影响:
|
||||
````cpp
|
||||
std::deque<int> d;
|
||||
...
|
||||
|
Loading…
Reference in New Issue
Block a user