c++ - 在 C++ 中使用 auto 声明变量有缺点吗?

标签 c++ c++11 type-inference auto

auto 似乎是 C++11 中添加的一个相当重要的功能,它似乎遵循了许多较新的语言。与 Python 这样的语言一样,我没有看到任何显式的变量声明(我不确定是否可以使用 Python 标准)。

使用 auto 来声明变量而不是显式声明它们有什么缺点吗?

最佳答案

问题是关于 auto 的缺点,所以这个答案突出了其中的一些。使用编程语言特性(在这种情况下,与语言关键字相关联的工具)的缺点并不意味着该特性是 Not Acceptable ,也不意味着应该完全避免该特性。这意味着有缺点也有优点,因此决定使用 auto 类型推导而不是替代方案必须考虑工程权衡。

如果使用得当,auto 也有几个优点——这不是问题的主题。缺点是易于滥用,以及代码以非预期或意外方式运行的可能性增加。

主要缺点是,通过使用auto,您不一定知道正在创建的对象的类型。在某些情况下,程序员可能希望编译器推断出一种类型,但编译器却坚决地推断出另一种类型。

给定一个类似的声明

auto result = CallSomeFunction(x,y,z);

您不一定知道 result 是什么类型。它可能是一个 int。它可能是一个指针。可能是别的东西。所有这些都支持不同的操作。您还可以通过像

这样的微小更改来显着更改代码
auto result = CallSomeFunction(a,y,z);

因为,根据 CallSomeFunction() 存在的重载,结果的类型可能完全不同 - 因此后续代码的行为可能与预期完全不同。您可能会在以后的代码中突然触发错误消息(例如,随后尝试取消引用 int,尝试更改现在为 const 的内容)。更险恶的更改是您的更改通过编译器,但随后的代码以不同和未知的方式表现 - 可能是错误的 - 方式。例如(如 sashoalm 在注释中所指出的),如果变量的推导类型将整数类型更改为浮点类型 - 并且后续代码会意外且无声地受到精度损失的影响。

因此,由于不明确了解某些变量的类型,因此很难严格证明代码按预期工作的说法是正确的。这意味着需要付出更多努力来证明在高关键性(例如安全关键或任务关键)领域中“符合目的”的主张是正确的。

另一个更常见的缺点是程序员倾向于使用 auto 作为强制代码编译的钝器,而不是考虑代码在做什么,并努力获得没错。

关于c++ - 在 C++ 中使用 auto 声明变量有缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34758042/

相关文章:

c++ - 未解析的外部符号,混淆

c++ - pthread_create 没有参数?

java - 为什么在映射到 Callable<T> 时需要显式提供类型参数?

haskell - 这是 Haskell 类型推理的实际应用,还是其他什么?

c++ - 是否可以覆盖特定父级的虚拟函数?

c++ - 如何将逐顶点属性传递给 GLSL 着色器

c++ - 键盘 Hook alt-tab 导致奇怪的行为?

c++ - 忽略两个 C++ 宏之间的代码(防止创建静态单元测试对象)

c++ - 带取消引用和不带取消引用的函数有什么区别

types - 为什么 Rust 不能推断 Iterator::sum 的结果类型?