【问题标题】:Why must 'auto' declarations all be of the same type?为什么“自动”声明必须都是同一类型?
【发布时间】:2013-05-14 14:01:47
【问题描述】:

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

哪一段会禁止这样做?

【问题讨论】:

  • 顺便说一句 - 7.1.6.4/3 中的示例用法是 const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int - 显然这个想法是在创建后续变量时可以使用第一个变量的类型推导......

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


【解决方案1】:

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

如果声明符列表包含多个声明符,则每个声明变量的类型都按上述确定。 如果每次推导模板参数U的类型不一样,则程序非良构。

【讨论】:

  • 是的,我碰巧读的草稿中没有那一段。我的问题中的“......”在那之后。我买了最终标准来验证我的问题,因为我很怀疑。
  • 答案实际上不是在[dcl.spec.auto]/6,而不是[dcl.spec.auto]/7
【解决方案2】:

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

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

其中“U”在上一段中被描述为用于推导每个参数的发明类型。这是对草案的不幸更改,因为它本来是一个非常好的功能。 (不过,我也可能误解了标准中的前一段,因为它也涉及 std::initializer_list)

【讨论】:

  • N3337 也有这一段。
  • 我可以看到这使得编译器实现者可能会稍微容易一些。
猜你喜欢
  • 2017-09-18
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多