2013-05-20 84 views
14

似乎不允许使用auto关键字来声明不同类型的多个变量。但是我无法弄清楚标准中可以阻止它的措词。为什么必须'自动'声明都是相同的类型?

auto i = 1, j = 1.0; //deduction failure (several compilers) 

历史我理解,因为你只有一次DECL说明符规格。然而,标准中的规则似乎并不排除,实际上他们鼓励,auto可能是一个不同的类型。考虑这些段落:

8-3在一个声明中的每个初始化声明符单独分析,如果它是在本身的声明。

7.1.6.4-7如果声明符列表包含多个声明符,则每个声明的变量的类型如上所述确定为 。 [...]

即使没有auto不具有相同的类型,因为某些修饰像*可以单独应用于每个声明符所需的所有变量。对我来说,现在看来,措辞允许每个auto声明是一个完全不同的类型。

哪一段会禁止这个?

+1

顺便说一句 - 7.1.6.4/3中的例子用法是'const auto * v =&x,u = 6; // OK:v的类型为const int *,u的类型为const int' - 显然,想法是从第一个变量中删除类型可以用于创建后续的... –

回答

9

类型推演,但最终的结果必须是单一类型[dcl.spec.auto]/7(重点地雷):

如果声明符列表包含多个声明符,则每个声明变量的类型都按上述方法确定。 如果为每个演绎推导出的模板参数U的类型不相同,则该程序是不合格的。

+0

是的,这段文字没有出现在我正在阅读的草稿中。 '...'在我的问题之后。我买了最终的标准来验证我的问题,因为我很怀疑。 –

+0

实际上''dcl.spec.auto]/6'中的回答不是'[dcl.spec.auto]/7'吗? –

2

我发现校正措词(它是那些实际上 最终 后期草案和官方标准之间的不同的一个)。

7.1.6.4-7如果声明符的列表中包含一个以上的说明符,如上面描述的每个声明的变量的类型被确定 。如果针对模板参数U推导出的类型在每个推导中不相同,那么 程序是格式不正确的。

其中'U'在前一段中描述为用于扣除每个参数的发明类型。这对草案来说是一个不幸的变化,因为它会是一个非常好的功能。 (我也可以,虽然误解标准前款规定的,因为它也用的std :: initializer_list交易)列表中的每个对象进行

+0

N3337也有该段落。 –

+0

我可以看到这让编译器实现者稍微容易一些。 – Yakk

相关问题