fix some typos

This commit is contained in:
chingyat 2016-12-17 11:31:15 +08:00
parent 16e79a5eec
commit c02d0b2635

View File

@ -1,4 +1,4 @@
## Item 3:Understand decltype
## Item 3: Understand decltype
条款三:理解decltype
**decltype**是一个奇怪的东西。给它一个名字或者表达式**decltype**就会告诉你名字或者表达式的类型。通常,它会精确的告诉你你想要的结果。但有时候它得出的结果也会让你挠头半天最后只能网上问答求助寻求解释。
@ -96,7 +96,7 @@ decltype(auto) myWidget2 = cw; //decltype类型推导
template<typename Container,typename Index>
decltype(auto) authAndAccess(Container& c,Index i);
````
容器通过传引用的方式传递非常量左值引用,因为返回一个引用允许用户可以修改容器。但是这意味着在这个函数里面不能传值调用,右值不能被绑定到左值引用上(除非这个左值引用一个const但是这里明显不是
容器通过传引用的方式传递非常量左值引用,因为返回一个引用允许用户可以修改容器。但是这意味着在这个函数里面不能传值调用,右值不能被绑定到左值引用上(除非这个左值引用一个const但是这里明显不是
公认的向**authAndAccess**传递一个右值是一个[edge case](https://en.wikipedia.org/wiki/Edge_case)。一个右值容器是一个临时对象通常会在authAndAccess调用结束被销毁这意味着authAndAccess返回的引用将会成为一个悬置的(dangle)引用。但是使用向authAndAccess传递一个临时变量也并不是没有意义有时候用户可能只是想简单的获得临时容器中的一个元素的拷贝比如这样
````cpp
@ -121,7 +121,7 @@ authAndAccess(Container&& c,Index i){
return std::forward<Container>(c)[i];
}
````
这样就能对我们的期望交上一份满意的答卷但是这要求编译器支持C++14。如果你没有这样的编译器你还需要使用C++11版本的模板它看起来和C++14版本的极为相,除了你不得不指定函数返回类型之外:
这样就能对我们的期望交上一份满意的答卷但是这要求编译器支持C++14。如果你没有这样的编译器你还需要使用C++11版本的模板它看起来和C++14版本的极为相,除了你不得不指定函数返回类型之外:
````cpp
template<typename Container,typename Index> //最终的C++11版本
decltype(auto)
@ -145,7 +145,7 @@ int x =0;
````
x是一个变量的名字所以**decltype(x)**是**int**。但是如果用一个小括号包覆这个名字,比如这样**(x)**,就会产生一个比名字更复杂的表达式。对于名字来说,**x**是一个左值C++11定义了表达式**(x)**也是一个左值。因此**decltype((x))**是**int&**。用小括号覆盖一个名字可以改变decltype对于名字产生的结果。
在C++11中这稍微有点奇怪但是由于C++14允许了**decltype(auto**的使用,这意味着你在函数返回语句中细微的改变就可以影响类型的推导:
在C++11中这稍微有点奇怪但是由于C++14允许了**decltype(auto)**的使用,这意味着你在函数返回语句中细微的改变就可以影响类型的推导:
````cpp
decltype(auto) f1()
{