似乎 auto
是 C++11 中添加的一个相当重要的特性,它似乎遵循了许多较新的语言。与 Python 之类的语言一样,我没有看到任何显式变量声明(我不确定是否可以使用 Python 标准)。
使用 auto
来声明变量而不是显式声明它们有缺点吗?
原文由 DxAlpha 发布,翻译遵循 CC BY-SA 4.0 许可协议
似乎 auto
是 C++11 中添加的一个相当重要的特性,它似乎遵循了许多较新的语言。与 Python 之类的语言一样,我没有看到任何显式变量声明(我不确定是否可以使用 Python 标准)。
使用 auto
来声明变量而不是显式声明它们有缺点吗?
原文由 DxAlpha 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
问题是关于
auto
的缺点,所以这个答案突出了其中的一些。使用编程语言特性(在这种情况下,与语言关键字相关联的工具)的缺点并不意味着该特性是不可接受的,也不意味着应该完全避免该特性。这意味着有缺点也有优点,因此决定使用auto
类型扣除替代替代品必须考虑工程权衡。如果使用得当,
auto
也有几个优点——这不是问题的主题。缺点是易于滥用,以及代码以非预期或意外方式运行的可能性增加。主要缺点是,通过使用
auto
,您不一定知道正在创建的对象的类型。在某些情况下,程序员可能希望编译器推断出一种类型,但编译器却坚决地推断出另一种类型。给定一个像这样的声明
您不一定知道
result
是什么类型。它可能是int
。它可能是一个指针。可能是别的东西。所有这些都支持不同的操作。您还可以通过像这样的微小更改来显着更改代码因为,取决于
CallSomeFunction()
存在哪些重载,结果的类型可能完全不同 - 因此后续代码的行为可能与预期完全不同。您可能会在以后的代码中突然触发错误消息(例如,随后尝试取消引用int
,尝试更改现在的const
)。更险恶的更改是您的更改通过编译器,但随后的代码以不同和未知的方式表现 - 可能是错误的 - 方式。例如(如 sashoalm 在注释中指出的那样),如果变量的推导类型将整数类型更改为浮点类型 - 并且后续代码会意外且无声地受到精度损失的影响。因此,由于不明确了解某些变量的类型,因此很难严格证明代码按预期工作的说法是正确的。这意味着需要付出更多努力来证明在高关键性(例如安全关键或任务关键)领域中“适合目的”的主张是正确的。
另一个更常见的缺点是程序员倾向于使用
auto
作为强制代码编译的钝器,而不是考虑代码在做什么,并努力使其正确。