item3: suppress extra emphasis by adding space chars

This commit is contained in:
yang 2018-10-28 11:19:32 +08:00 committed by GitHub
parent 2d9ae59c29
commit e28ac91b39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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;
...