为什么'auto'声明必须属于同一类型?

时间:2013-05-20 03:48:35

标签: c++ c++11 language-lawyer

似乎不允许使用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声明符是完全不同的类型。

哪一段会禁止这个?

2 个答案:

答案 0 :(得分:9)

对列表中的每个对象执行类型推导,但最终结果必须是单一类型[dcl.spec.auto]/7(强调我的):

  

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

答案 1 :(得分:2)

我找到了更正的措辞(这是最终 晚期草案与官方标准之间实际不同的措辞之一。)

  

7.1.6.4-7如果声明符列表包含多个声明符,则确定每个声明变量的类型   如上所述。如果为模板参数U推导出的类型在每个演绎中不相同,则   节目形成不良。

其中'U'在前一段中描述为用于扣除每个参数的发明类型。这是对草案的一个不幸的改变,因为它将是一个非常好的功能。 (我也可能误解了标准中的前一段,因为它也处理了std :: initializer_list)