C ++ 11中auto关键字的动机和陷阱(?)


20

我最近想知道为什么auto在C ++ 11中选择了关键字来标记必须由编译器推断类型的变量,例如

auto x = 1;

以来

  1. var 在其他编程语言(例如C#,Scala,JavaScript)中似乎更常见,并且
  2. 据我所知,autobreaks向后兼容的新语义(它很少使用,但在以前的C ++版本中具有不同的含义,请参见例如此处)。

我想问一下是否有一个特殊的原因选择auto(赞成var或其他任何关键字)。在C ++ 11标准发布之前是否有关于此问题的特定讨论?

另外,在使用C ++ 11编译器重新编译旧版C ++代码时,是否应该注意任何可能的不兼容性?


9
新的语义auto可能会破坏向后兼容性,但是,根据varauto11之前的代码中使用关键字的频率相比,用作变量名的频率,委员会可能认为与引入新的兼容性相比,破坏兼容性的可能性不那么大。关键字会。
sepp2k 2012年

2
“按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或特定专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩大讨论。如果您认为这个问题可以改进,甚至可以重新打开,请参阅FAQ中的指导。”:这个问题是在询问一个事实:是否有关于此主题的讨论。有两个可能的答案:是和否。
乔治

2
当然,进行了讨论,这使得该问题在此方面毫无意义。在autoVS var的问题是什么90%的文字是指,并认为这一问题没有明确的结果。(尽管我不是投票关闭的人)
Telastyn 2012年

1
@Telastyn:如果我知道有人在讨论这个话题,那我就不会问了。谷歌搜索“自动与var C ++”或“自动C ++”在此主题上未返回任何内容。
乔治

1
autovar在C#中引入之前针对C ++提出的,因此问题应该是为什么C#不使用auto。var在JavaScript和Scala中具有不同的含义
adrianm

Answers:


37

您几乎可以想到要添加为语言的关键字的每个单词几乎都肯定被用作变量名或工作代码的其他部分。如果您将该单词设为关键字,则该代码将被破坏。

令人不可思议的auto是,它已经是一个关键字,因此人们没有使用该名称的变量,但是没有人使用它,因为它是默认名称。为什么输入:

auto int i=0;

什么时候

int i=0;

是完全一样的意思吗?

我想在地球上的某个地方,有少量的代码以旧方式使用“自动”。但是可以通过删除“自动”来修复它,并且它将再次起作用。因此,重新设置关键字的用途是一个显而易见的选择。

我也碰巧认为这是一个更清晰的含义。如果您使用过变体之类的方法,那么看到var该声明时,您可能会认为声明的键入强度要比您自己按下键盘上的所有键来指定变量类型的强度低。对我来说,auto您可以让编译器自动推断出类型,这一点就和您自己指定的类型一样强大。因此,确实是一次非常幸运的休息,为委员会赢得了好名声。

为了阐明(小的)突破:

如果你有

auto int i=0;

并尝试使用C ++ 11编译器进行编译,您现在会收到如下错误:

错误C3530:“自动”不能与任何其他类型说明符组合

这很简单,您只需删除auto或int并重新编译即可。

不过,还有一个更大的问题。如果你有

auto i = 4.3;

C和真正古老的C ++会做i一个int(就像您不做的那样auto-默认声明是int)。如果您花了很长时间没有编译这段代码,或者一直在使用旧的编译器,那么至少从理论上讲,您可能会有一些这段代码。C ++ 11使其成为double4.3,因为这就是。(或者可能是float,我仍处于节礼日模式,但要点不是int。)这可能会在您的应用程序中引入一些细微的错误。并且没有来自编译器的任何警告或错误。这条船上的人们应该大胆auto地搜索以确保在使用C ++ 11编译器之前,不要以旧的方式使用它。幸运的是,这样的代码非常罕见。


感谢您的明确答复。+1我了解到在以几乎无害的方式降低向后兼容性和很大的机会不会用new关键字破坏旧代码之间的权衡。
乔治

实际上是否存在任何不兼容性?C ++ 11编译器会否忽略auto是否在其后跟类型名称?
aaaaaaaaaaaaaa 2012年

1
Visual C ++ 2012遵循error C3530: 'auto' cannot be combined with any other type-specifier这一原则
Kate Gregory

3
@KateGregory:实际上,没问题auto i = 4.3;,因为它在C ++ 03 / C ++ 98中格式不正确。C ++并没有在携带“隐式int”规则,即C89有(以及C99修订丢弃)。
Bart van Ingen Schenau 2012年

1
@Kate Gregory:如果您可以考虑Bart的观察并相应地更改您的答案,我会将其标记为可接受的答案。
Giorgio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.