为什么C ++ 11'auto'关键字不适用于静态成员?

时间:2013-01-11 19:22:53

标签: c++ c++11 auto

class Foo {
 public:
  static const char *constant_string;
};

auto Foo::constant_string = "foo";

int main(void) {
};

编译:gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3像这样:

gcc -std=c++0x ./foo.cc 
./foo.cc:6:11: error: conflicting declaration ‘auto Foo::constant_string’
./foo.cc:3:22: error: ‘Foo::constant_string’ has a previous declaration as ‘const char* Foo::constant_string’
./foo.cc:6:11: error: declaration of ‘const char* Foo::constant_string’ outside of class is not definition [-fpermissive]

这是auto关键字的预期行为,还是gcc +

中的错误

2 个答案:

答案 0 :(得分:11)

语言不允许:

  

[C++11: 7.1.6.4]:

     

1 auto 类型说明符表示声明的变量的类型应从其初始化程序推导出,或者函数声明符应包括尾返回型

     

2 auto 类型说明符可能会出现一个带有 trailing-return-type 的函数声明符(8.3。 5)在此类声明者有效的任何情况下。

     

3 否则,变量的类型是从其初始化程序推导出来的。声明的变量的名称不应出现在初始化表达式中。在块(6.3),命名空间范围(3.3.6)和 for-init-statement (6.5.3)中声明变量时,允许使用autoauto将作为 decl-specifier-seq 中的 decl-specifiers 之一出现,而 decl-specifier-seq 将出现后面跟着一个或多个 init-declarators ,每个 init-declarators 都有一个非空初始值设定项

     

4 还可以使用auto 类型说明符 来声明条件中的变量 of选择语句(6.4)或迭代语句(6.5),在 new-type-id 类型的 type-specifier-seq 中-id new-expression (5.3.4),在for-range-declaration中,在声明静态数据成员时使用 brace-or -equal-initializer 出现在类定义的成员规范 (9.4.2)中。

     

5 在本节未明确允许的上下文中使用auto的程序格式不正确。

很难证明是消极的,但标准中没有明确的规则允许auto在您的情况下。

但是,相同的规则意味着以下 有效:

struct Foo {
   static constexpr auto constant_string = "foo";
};

int main() {}

(请注意,Foo::constant_string的类型为char const* const,而不是char const[3]; this is an effect of using auto。)

答案 1 :(得分:2)

Visual C ++接受

decltype(Foo::constant_string) Foo::constant_string = "foo";