C 11 - 将非静态数据成员声明为“自动”

新手上路,请多包涵

如果在声明中初始化非静态数据成员,C++11 是否允许将它们声明为“自动”?例如:

 struct S
{
    auto x = 5;  // in place of 'int x = 5;', which is definitely allowed
};

GCC 4.7 拒绝上述代码,但它接受 int x = 5;

假设这不是编译器错误,而是标准确实不允许,为什么不呢?它与声明局部变量一样有用 auto

原文由 HighCommander4 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 628
1 个回答

禁止非静态成员的规则在 7.1.6.4 第 4 条中:

auto 类型说明符也可用于在选择语句 (6.4) 或迭代语句 (6.5) 的条件中声明变量,在 new-type-id 或 type-id 的 type-specifier-seq 中一个新表达式 (5.3.4),在一个 for-range-declaration 中,以及在声明一个带有大括号或相等初始化器的 静态数据成员,该初始化器出现在类定义的成员规范中 (9.4.2) .

我发现它的基本原理是静态 的, 这反映了 James McNellis 在评论中的解释。

一个国家机构不喜欢允许非静态的自动类型说明符。从给作者的电子邮件中:

     template< class T >
    struct MyType : T {
      auto data = func();
      static const size_t erm = sizeof(data);
    };

为了确定 X 的布局,我们现在有 2 阶段名称查找和 ADL。请注意, func 可以是类型或函数;它可以在 T、MyType 的命名空间、实例化时 T 的关联命名空间、全局命名空间、匿名命名空间或任何受 using 指令约束的命名空间中找到。小心我们可能会抛出一些 concept_map 查找以求好运。根据标题包含的顺序,我什至可能会得到不同的 ADL 结果,并打破一个定义规则——这不需要被诊断。

由于这个争议,作者不再建议对非静态数据成员允许 auto 。

因此,基本上根据包含标题的顺序, data 的类型可能会有很大不同。当然, auto x = 5; 不需要依赖 2 阶段名称查找或 ADL,但是,我假设他们将其设为“一揽子”规则,否则,他们将不得不制定单独的规则对于每个会使事情变得非常复杂的用例。

在同一篇论文中,作者提议取消这个限制,然而,这个提议似乎被拒绝了,可能是由于上述理由,而且无论初始化器是什么,预期的行为都可以是相同的。

原文由 Jesse Good 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题