我不喜欢一般用途的汽车有几个原因:
- 您可以重构代码而无需修改它。是的,这是经常列举为使用auto的好处之一。只需更改函数的返回类型,如果调用该函数的所有代码都使用了auto,则无需额外的工作!您点击编译,它会生成-0个警告,0个错误-并且您只需继续检查代码即可,而无需处理检查和可能修改该函数使用的80个位置的麻烦。
但是,等等,这真的是一个好主意吗?如果在六个用例中类型很重要,而现在的代码实际上却表现不同,该怎么办?通过不仅修改输入值,而且修改调用该函数的其他类的私有实现的行为本身,这也可能隐式破坏封装。
1a。我相信“自我记录代码”的概念。自我记录代码背后的原因是注释趋于过时,不再反映代码在做什么,而代码本身(如果以显式方式编写)是不言自明的,始终保持最新状态它的意图,不会让您对陈旧的评论感到困惑。如果可以在无需修改代码本身的情况下更改类型,那么代码/变量本身将变得过时。例如:
自动bThreadOK = CheckThreadHealth();
除非问题是CheckThreadHealth()在某个时候被重构为返回一个指示错误状态的枚举值(如果有),而不是布尔值。但是进行更改的人错过了检查这行特定代码的过程,并且编译器没有帮助,因为编译时没有警告或错误。
- 您可能永远都不知道实际的类型是什么。这通常也被列为汽车的主要“好处”。当您只能说“谁在乎?它会编译!”时,为什么要了解功能为您提供的功能呢?
它甚至可能是一种作品。我说这种方法是可行的,因为即使您为每次循环迭代都复制了一个500字节的结构,因此您可以检查其上的单个值,但是代码仍然可以完全正常工作。因此,即使您的单元测试也无法帮助您意识到不良的代码正隐藏在这种简单且无辜的汽车后面。扫描文件的大多数其他人也不会乍一看。
如果您不知道类型是什么,也可能使情况变得更糟,但是您选择的变量名称对其含义进行了错误的假设,实际上实现了与1a中相同的结果,但是从一开始就而不是后重构。
- 最初编写代码时输入代码不是编程中最耗时的部分。是的,auto使最初编写某些代码的速度更快。作为免责声明,我确实输入> 100 WPM,所以它可能不会像其他人那样困扰我。但是,如果我只需要整天编写新代码,我将是一个快乐的露营者。编程中最耗时的部分是诊断代码中难以重现的边缘错误,这些错误通常是由细微的非显而易见的问题引起的,例如,可能会引入对auto的过度使用(引用与复制,有符号与无符号,浮点与整数,布尔与指针等)。
在我看来,显而易见,auto最初是作为标准库模板类型的可怕语法的变通方法而引入的。而不是尝试修复人们已经熟悉的模板语法-由于可能会破坏所有现有代码,因此这几乎也是不可能的-添加一个基本上可以隐藏问题的关键字。本质上,您可能称之为“黑客”。
实际上,我对标准库容器中的auto使用没有异议。显然是为关键字创建的,标准库中的函数不太可能从根本上改变目的(或类型),从而使auto相对安全地使用。但是对于在您自己的代码和接口中使用它可能会更加不稳定,并且可能会进行更根本的更改,我将非常谨慎。
auto的另一个有用的应用程序可以增强语言的功能,即在与类型无关的宏中创建临时变量。这是您以前真正无法做到的事情,但是您现在就可以做到。
auto
当它们已经很难阅读时,通常可能会使事情变得更难阅读,例如,函数太长,变量命名错误等。在具有恰当命名变量的短函数上,知道类型应该是#1简单或#2不相关的类型之一。