Update item5.md

This commit is contained in:
猫耳堀川雷鼓 2021-03-02 11:56:51 +08:00 committed by GitHub
parent d8a29dc32d
commit 577760c36d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -25,7 +25,7 @@ void dwim(It b, It e) //dwim“do what I mean”算法
while (b != e) {
typename std::iterator_traits<It>::value_type
currValue = *b;
...
}
}
````
@ -51,7 +51,7 @@ void dwim(It b,It e)
{
while (b != e) {
auto currValue = *b;
...
}
}
````
@ -96,7 +96,7 @@ std::function<bool(const std::unique_ptr<Widget> &,
使用`auto`除了可以避免未初始化的无效变量省略冗长的声明类型直接保存闭包外它还有一个好处是可以避免一个问题我称之为与类型快捷方式type shortcuts有关的问题。你将看到这样的代码——甚至你会这么写
````cpp
std::vector<int> v;
...
unsigned sz = v.size();
````
`v.size()`的标准返回类型是`std::vector<int>::size_type`,但是只有少数开发者意识到这点。`std::vector<int>::size_type`实际上被指定为无符号整型,所以很多人都认为用`unsigned`就足够了,写下了上述的代码。这会造成一些有趣的结果。举个例子,在**Windows 32-bit**上`std::vector<int>::size_type`和`unsigned`是一样的大小,但是在**Windows 64-bit**上`std::vector<int>::size_type`是64位`unsigned`是32位。这意味着这段代码在Windows 32-bit上正常工作但是当把应用程序移植到Windows 64-bit上时就可能会出现一些问题。谁愿意花时间处理这些细枝末节的问题呢
@ -108,11 +108,11 @@ auto sz =v.size(); //sz的类型是std::vector<int>::size_type
你还是不相信使用`auto`是多么明智的选择?考虑下面的代码:
````cpp
std::unordered_map<std::string, int> m;
...
for(const std::pair<std::string, int>& p : m)
{
... //用p做一些事
//用p做一些事
}
````
看起来好像很合情合理的表达,但是这里有一个问题,你看到了吗?
@ -123,7 +123,7 @@ for(const std::pair<std::string, int>& p : m)
````cpp
for(const auto& p : m)
{
... //如之前一样
//如之前一样
}
````
这样无疑更具效率,且更容易书写。而且,这个代码有一个非常吸引人的特性,如果你获取`p`的地址,你确实会得到一个指向`m`中元素的指针。在没有`auto`的版本中`p`会指向一个临时变量,这个临时变量在每次迭代完成时会被销毁。