【发布时间】:2012-07-03 10:00: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 一样有用。
【问题讨论】:
-
允许以这种方式声明静态数据成员,但不能声明非静态数据成员(参见 C++11 §7.1.6.4 中允许的
auto使用列表)。在我的脑海中,我想不出一个很好的理由来禁止它,尽管我肯定会认为这是对auto的滥用。 -
@JamesMcNellis:你为什么认为这是对
auto的滥用?在类范围内拥有一个具有长/复杂类型名称的变量(因此最好使用auto而不是写出它的类型)与在本地范围内拥有一个变量有什么区别? -
在块范围内,我知道变量是如何使用的。在类范围或命名空间范围内,我不一定知道变量是如何使用的。例如,考虑更一般的
auto x = f(a, b, c);:我必须找到所有f()函数并在脑海中执行重载决议以找出x的类型。至少在本地范围内,我可以查看x正在做什么,并尝试从中推断出它的类型。auto非常有用,但不应该在任何地方使用。 -
@JamesMcNellis:有趣的是,
auto在命名空间范围内是允许的。我不明白为什么类范围会这样被挑出来...... -
参见this ISOCPP mailing list discussion关于非静态自动成员的原型实现,以及委员会在N3897 Auto-type members中记录的讨论。
标签: c++ c++11 auto variable-declaration