Merge pull request #90 from xris1658/patch-1

Update item5.md
This commit is contained in:
Yi Yang 2021-05-24 20:50:33 +08:00 committed by GitHub
commit 66dfa84f9e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -132,11 +132,11 @@ for(const auto& p : m)
基于这些原因我建议你优先考虑`auto`而非显式类型声明。然而`auto`也不是完美的。每个`auto`变量都从初始化表达式中推导类型,有一些表达式的类型和我们期望的大相径庭。关于在哪些情况下会发生这些问题,以及你可以怎么解决这些问题我们在[Item2](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/1.DeducingTypes/item2.md)和[6](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/2.Auto/item6.md)讨论所以这里我不再赘述。我想把注意力放到你可能关心的另一点使用auto代替传统类型声明对源码可读性的影响。
首先,深呼吸,放松,`auto`是**可选项**,不是**命令**,在某些情况下如果你的专业判断告诉你使用显式类型声明比`auto`要更清晰更易维护,那你就不必再坚持使用`auto`。牢记C++没有在其他众所周知的语言所拥有的类型接口(*type interface*上开辟新土地。其他静态类型的过程式语言如C#、D、Sacla、Visual Basic等或多或少的都有那些非静态类型的函数式语言如ML、Haskell、OCaml、F#等的特性。在某种程度上几乎没有显式类型使得动态类型语言Perl、Python、Ruby等取得了成功软件开发社区对于类型接口有丰富的经验,他们展示了在维护大型工业强度的代码上使用这种技术没有任何争议。
首先,深呼吸,放松,`auto`是**可选项**,不是**命令**,在某些情况下如果你的专业判断告诉你使用显式类型声明比`auto`要更清晰更易维护,那你就不必再坚持使用`auto`。但是要牢记C++没有在其他众所周知的语言所拥有的类型推导(*type inference*上开辟新土地。其他静态类型的过程式语言如C#、D、Sacla、Visual Basic或多或少都有等价的特性更不必提那些静态类型的函数式语言了如ML、Haskell、OCaml、F#等。在某种程度上这是因为动态类型语言如Perl、Python、Ruby等的成功在这些语言中几乎没有显式的类型声明。软件开发社区对于类型推导有丰富的经验,他们展示了在维护大型工业强度的代码上使用这种技术没有任何争议。
一些开发者也担心使用`auto`就不能瞥一眼源代码便知道对象的类型然而IDE扛起了部分担子也考虑到了[Item4](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/1.DeducingTypes/item4.md)中提到的IDE类型显示问题在很多情况下少量显示一个对象的类型对于知道对象的确切类型是有帮助的这通常已经足够了。举个例子要想知道一个对象是容器还是计数器还是智能指针不需要知道它的确切类型一个适当的变量名称就能告诉我们大量的抽象类型信息。
一些开发者也担心使用`auto`就不能瞥一眼源代码便知道对象的类型然而IDE扛起了部分担子也考虑到了[Item4](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/1.DeducingTypes/item4.md)中提到的IDE类型显示问题在很多情况下少量显示一个对象的类型对于知道对象的确切类型是有帮助的这通常已经足够了。举个例子要想知道一个对象是容器还是计数器还是智能指针不需要知道它的确切类型一个适当的变量名称就能告诉我们大量的抽象类型信息。
真正的问题是显式指定类型可以避免一些微妙的错误,以及更具效率和正确性,而且,如果初始化表达式改变变量的类型也会改变,这意味着使用`auto`可以帮助我们完成一些重构工作。举个例子,如果一个函数返回类型被声明为`int`,但是后来你认为将它声明为`long`会更好,调用它作为初始化表达式的变量会自动改变类型,但是如果你不使用`auto`你就不得不在源代码中挨个找到调用地点然后修改它们。
真正的问题是显式指定类型可以避免一些微妙的错误,以及更具效率和正确性,而且,如果初始化表达式的类型改变,则`auto`推导出的类型也会改变,这意味着使用`auto`可以帮助我们完成一些重构工作。举个例子,如果一个函数返回类型被声明为`int`,但是后来你认为将它声明为`long`会更好,调用它作为初始化表达式的变量会自动改变类型,但是如果你不使用`auto`你就不得不在源代码中挨个找到调用地点然后修改它们。
**请记住:**