似乎不允许使用auto
关键字声明不同类型的多个变量。我无法弄清楚标准中可能会阻止它的措辞。
auto i = 1, j = 1.0; //deduction failure (several compilers)
从历史上我理解,因为你只有一个 decl-specifier-spec 。但是,标准中的规则似乎并未排除,事实上它们鼓励auto
可以是每种规则的不同类型。请考虑以下段落:
8-3声明中的每个 init-declarator 都会被单独分析,就好像它本身就是声明一样。
7.1.6.4-7如果声明符列表包含多个声明符,则确定每个声明变量的类型 如上所述。 [...]
即使没有auto
,并非所有变量都需要具有相同的类型,因为某些修饰符(如*
)可以单独应用于每个声明符。现在看来,措辞允许每个auto
声明符是完全不同的类型。
哪一段会禁止这个?
答案 0 :(得分:9)
对列表中的每个对象执行类型推导,但最终结果必须是单一类型[dcl.spec.auto]/7
(强调我的):
如果声明符列表包含多个声明符,则每个声明的变量的类型如上所述确定。 如果模板参数U的推导类型在每次扣除中不相同,则程序格式不正确。
答案 1 :(得分:2)
我找到了更正的措辞(这是最终 晚期草案与官方标准之间实际不同的措辞之一。)
7.1.6.4-7如果声明符列表包含多个声明符,则确定每个声明变量的类型 如上所述。如果为模板参数U推导出的类型在每个演绎中不相同,则 节目形成不良。
其中'U'在前一段中描述为用于扣除每个参数的发明类型。这是对草案的一个不幸的改变,因为它将是一个非常好的功能。 (我也可能误解了标准中的前一段,因为它也处理了std :: initializer_list)