13
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+ 中的错误

4

2 回答 2

11

语言不允许:

[C++11: 7.1.6.4]:

1auto 类型说明符表示被声明的变量的类型应从其初始值设定项推导出来,或者函数声明符应包括一个尾随返回类型

2在这样的声明符有效的任何上下文中,auto 类型说明符可以与带有尾随返回类型(8.3.5)的函数声明符一起出现。

3否则,变量的类型是从它的初始化器推导出来的。被声明的变量的名称不应出现在初始化表达式中。auto在块 (6.3)、命名空间范围 (3.3.6) 和for-init-statement (6.5.3)中声明变量时,允许使用。auto应作为 decl-specifiers 之一出现decl -specifier-seq中,并且decl-specifier-seq后面应跟随一个或多个init-declarators,每个 init-declarators 应有一个非空初始化器

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

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

很难证明是否定的,但标准中根本没有明确的规则允许auto您的情况。

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

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

int main() {}

(请注意,类型Foo::constant_stringchar const* const而不是,比如说,char const[3]这是使用的效果auto。)

于 2013-01-11T19:28:27.727 回答
5

Visual C++ 接受

decltype(Foo::constant_string) Foo::constant_string = "foo";
于 2015-07-31T14:52:07.977 回答