问题是关于缺点auto
,所以这个答案强调了其中的一些。使用编程语言功能(在本例中为与语言关键字相关联的功能)的缺点并不意味着该功能不可接受,也不意味着应该完全避免该功能。这意味着优点和缺点同时存在,因此决定使用auto
对替代方案的类型推导必须考虑工程权衡。
使用得当的话,auto
还有几个优点 - 这不是问题的主题。这些缺点是由于易于滥用以及代码以非预期或意外方式运行的可能性增加所致。
主要缺点是,通过使用auto
,您不一定知道正在创建的对象的类型。也有一些情况,程序员可能期望编译器推导出一种类型,但编译器坚决推导出另一种类型。
给定一个像这样的声明
auto result = CallSomeFunction(x,y,z);
你不一定知道什么类型result
是。这可能是一个int
。它可能是一个指针。可能是别的东西。所有这些都支持不同的操作。您还可以通过微小的更改来显着更改代码,例如
auto result = CallSomeFunction(a,y,z);
因为,取决于存在什么重载CallSomeFunction()
结果的类型可能完全不同 - 因此后续代码的行为可能与预期完全不同。您可能会在后面的代码中突然触发错误消息(例如,随后尝试取消引用int
,试图改变现在的一些事情const
)。更险恶的更改是您的更改通过了编译器,但后续代码以不同且未知(可能有错误)的方式运行。例如(如 sashhoalm 在注释中所指出的)如果变量的推导类型将整型类型更改为浮点类型 - 并且后续代码会意外且默默地受到精度损失的影响。
因此,如果不明确了解某些变量的类型,就很难严格证明代码按预期工作。这意味着需要付出更多努力来证明高关键性(例如安全关键或任务关键)领域中“适合用途”的主张的合理性。
另一个更常见的缺点是程序员容易使用auto
作为强制代码编译的生硬工具,而不是思考代码在做什么,并努力使其正确。