如果在声明中初始化非静态数据成员,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 许可协议
禁止非静态成员的规则在 7.1.6.4 第 4 条中:
我发现它的基本原理是静态 的, 这反映了 James McNellis 在评论中的解释。
因此,基本上根据包含标题的顺序,
data
的类型可能会有很大不同。当然,auto x = 5;
不需要依赖 2 阶段名称查找或 ADL,但是,我假设他们将其设为“一揽子”规则,否则,他们将不得不制定单独的规则对于每个会使事情变得非常复杂的用例。在同一篇论文中,作者提议取消这个限制,然而,这个提议似乎被拒绝了,可能是由于上述理由,而且无论初始化器是什么,预期的行为都可以是相同的。