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 +
答案 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)中声明变量时,允许使用
auto
。auto
将作为 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";