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

How come you need initialisers for all variables when using auto in multiple declarations?

本文关键字:变量 设置 初始化 为什么 声明 auto      更新时间:2023-10-16

我原以为只有第一个声明才需要初始化器。例如

auto x = 2, y;

我希望它将x的类型推断为int,然后隐式地将"auto"替换为基类型"int",这意味着y将是默认的初始化整数。实际上整个程序都无法编译因为y显式地需要初始化器。同样,

对我来说也很奇怪
auto x = 2, y = 3.3;

也会导致错误。我本来希望y在double-to-int转换中初始化为3,但是:

错误:'auto': 'int'和'double'的演绎不一致

我通读了http://en.cppreference.com/w/cpp/language/auto,找不到明确的解释。实际上,那个链接似乎是站在我这边的:

一旦确定了初始化式的类型,编译器将使用从函数调用中推导模板参数的规则来确定替换关键字auto的类型(详细信息请参见模板参数推导#其他上下文)。

仅仅是"正当理由"吗?

仅仅是"正当原因"吗?

是的。

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

[C++11: 7.1.6.4/7]:如果声明器列表包含多个声明器,则按上述方式确定每个声明变量的类型。如果每次为模板形参U推导的类型不相同,则程序是病态的。

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

称它为c++的一个怪东西,但我想它的存在是为了帮助保持标准措辞的简单。毕竟,如果你的例子像你描述的那样工作,它不会有点混乱(我的意思是比auto更混乱/不清楚)吗?