在多个声明中使用auto时,为什么需要所有变量的初始化器?

时间:2015-07-28 09:56:32

标签: c++ c++11 declaration c++14 auto

我希望只有第一次声明才需要初始化器。 e.g。

auto x = 2, y;

我希望这可以将x的类型推断为int,然后用基类型“int”隐式替换“auto”,这意味着y将是一个默认的初始化整数。实际上整个事情都没有编译,因为y明确需要和初始化。同样,对我来说很奇怪

auto x = 2, y = 3.3;

也会导致错误。我希望y在双向int转换中初始化为3,但是:

  

错误:'auto'扣除不一致:'int'然后'double'

我通读了http://en.cppreference.com/w/cpp/language/auto,无法明确找到解释。实际上,似乎这个链接就在我身边:

  

一旦确定了初始值设定项的类型,编译器就会使用函数调用中的模板参数推导规则来确定将替换关键字auto的类型(有关详细信息,请参阅模板参数推导#Other contexts)。

这只是“正当理由”吗?

1 个答案:

答案 0 :(得分:4)

  

这只是“正当理由”吗?

两个变量都有推导类型,因此两个变量都需要初始化。需要两者具有相同类型的逻辑在推导后应用。

  

[C++11: 7.1.6.4/7]:如果声明符列表包含多个声明符,则每个声明的变量的类型如上所述确定。如果模板参数U推导出的类型在每次扣除中不相同,则程序格式不正确。

     

[C++14: 7.1.6.4/8]:如果 init-declarator-list 包含多个 init-declarator ,它们都将形成变量声明。每个声明的变量的类型如上所述确定,如果替换占位符类型的类型在每个演绎中不相同,则程序格式不正确。

称之为C ++古怪,但我想它可以帮助保持标准的措辞简单。毕竟,如果你的例子按照你描述的方式运作,那会不会有点令人困惑(并且我的意思是比auto更加混乱/不清楚)?