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

C++ 为什么在多个声明中使用auto时,所有变量都需要初始化器?,c++,c++11,declaration,c++14,auto,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被初始化为3,但是: 错误:“自动”的推断不一致:“int”和“double” 我通读了一遍,找不到明确的解释。实际上,这个链接似乎站在我这边: 一

我原以为只有在第一次声明中才需要初始化器。e、 g

auto x = 2, y;
我希望这会将x的类型推断为int,然后用基类型int隐式替换auto,这意味着y将是默认的初始化整数。实际上,整个程序并没有编译,因为y显式地需要和初始化器。同样,我觉得奇怪的是

auto x = 2, y = 3.3;
也会导致错误。我希望在双精度到整数的转换中y被初始化为3,但是:

错误:“自动”的推断不一致:“int”和“double”

我通读了一遍,找不到明确的解释。实际上,这个链接似乎站在我这边:

一旦确定了初始值设定项的类型,编译器将使用函数调用中模板参数推断的规则确定将替换关键字auto的类型。有关详细信息,请参阅模板参数推断其他上下文

这仅仅是原因吗

这仅仅是原因吗

这两个变量都有一个推断类型,因此这两个变量都需要一个初始化器。要求两者具有相同类型的逻辑在扣除后应用

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

[C++14:7.1.6.4/8]:如果init声明器列表包含多个init声明器,则它们都应构成变量声明。每个声明变量的类型如上所述确定,如果替换占位符类型的类型在每个推导中不相同,则程序的格式不正确


< >把它称为C++怪异,但我想它可以帮助保持标准措词简单。毕竟,如果您的示例如您所描述的那样工作,那么这不是有点令人困惑吗?我的意思是,如果您的示例如您所描述的那样工作,那么它会比auto更令人困惑/不清楚吗?

实际上,该链接似乎是站在我这边的,而事实并非如此。我不明白你为什么这么认为。我非常怀疑,为了标准的清晰性,合理的行为是否曾受到损害。标准本身有1350页长,各方面都很复杂。对这个问题的真正答案是针对实际原因,而不是某一特定段落禁止它。@Columbo:不喜欢把措词太复杂是很正常的。我并不是说委员会在总体上取得了成功。