关于'自动'演绎类型的困惑

Jay*_*esh 2 c++ types auto c++11

int i = 0;
Run Code Online (Sandbox Code Playgroud)

相当于

int i;
i = 0;
Run Code Online (Sandbox Code Playgroud)

然后,

auto i = 0;
Run Code Online (Sandbox Code Playgroud)

没关系,工作正常.但,

auto i;
i = 0;
Run Code Online (Sandbox Code Playgroud)

编译器给出错误.

那么,为什么编译器会出错?

el.*_*ado 7

它不等同,因为auto它不是一种类型.在两个示例中,i类型是int.auto表示变量类型是由它初始化的表达式类型决定的(在这种情况下,它是int,因为它是文字的类型0).那是,

auto i = 0;
Run Code Online (Sandbox Code Playgroud)

相当于:

int i = 0;
Run Code Online (Sandbox Code Playgroud)

片段

auto i;
i = 0;
Run Code Online (Sandbox Code Playgroud)

没有意义,因为没有表达式,编译器可以从中推断出类型.

有人可能会争辩说编译器可能会进一步推断类型,但这对于价值不大会有额外的努力,所以它不太可能让位于未来的C++标准中.以下示例将推断出哪种类型:

auto i;
if (...)
    i = 0;
else
    i = "WAT?";
Run Code Online (Sandbox Code Playgroud)

BTW,int i = 0;相当于int i; i = 0但不一样.首先是初始化,第二个是默认初始化,然后是赋值.对于非类型的int类,即具有非平凡构造函数和/或赋值运算符的类,这两个片段可能不等效.

  • @Deduplicator它们在语义上是等效的"编译器最有可能发出相同的机器代码",但在语言语法规则方面却不相同.特别是,当推广到"int"以外的类型时,这些表达式在任何意义上都可能不相同. (3认同)