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/