mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-27 12:21:01 +08:00
Update item5.md
This commit is contained in:
parent
d8a29dc32d
commit
577760c36d
@ -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`会指向一个临时变量,这个临时变量在每次迭代完成时会被销毁。
|
||||
|
Loading…
Reference in New Issue
Block a user