本文介绍了为什么 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 像这样:

Compiled with: gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 like this:

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

Is this intended behavior of the auto keyword, or a bug in gcc+

推荐答案

语言不允许:

[C++11: 7.1.6.4]:

auto type-specifier 表示被声明的变量的类型应该从它的初始化器或函数声明器中推导出来应包括尾随返回类型.

The auto type-specifier signifies that the type of a variable being declared shall be deduced from its initializer or that a function declarator shall include a trailing-return-type.

auto type-specifier 可以与带有 trailing-return-type 的函数声明符一起出现(8.3.5) 在此类声明符有效的任何上下文中.

The auto type-specifier may appear with a function declarator with a trailing-return-type (8.3.5) in any context where such a declarator is valid.

否则,变量的类型从它的初始值设定项中推导出来.被声明的变量的名称不应出现在初始化表达式中.在块 (6.3)、命名空间范围 (3.3.6) 和 for-init-statement (6.5.3).auto 应作为 decl-specifier-seqdecl-specifier-seq 中的 decl-specifiers 之一出现em> 后面应该有一个或多个init-declarators,每个声明符都应该有一个非空的初始化器.

Otherwise, the type of the variable is deduced from its initializer. The name of the variable being declared shall not appear in the initializer expression. This use of auto is allowed when declaring variables in a block (6.3), in namespace scope (3.3.6), and in a for-init-statement (6.5.3). auto shall appear as one of the decl-specifiers in the decl-specifier-seq and the decl-specifier-seq shall be followed by one or more init-declarators, each of which shall have a non-empty initializer.

auto 类型说明符也可以用于在中声明变量选择语句(6.4)或迭代语句(6.5)的条件,在new-type-idtype-specifier-seqnew-expression (5.3.4) 的 em>type-id,在 for-range-declaration 中,以及 在用 声明静态数据成员时出现在类定义的成员规范 (9.4.2) 中的大括号或相等初始化器.

The auto type-specifier can also be used in declaring a variable in the condition of a selection statement (6.4) or an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears within the member-specification of a class definition (9.4.2).

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

A program that uses auto in a context not explicitly allowed in this section is ill-formed.

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

It's hard to prove a negative, but there's simply no explicit rule in the standard to allow auto in your case.

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

However, the same rules mean that the following is valid:

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

int main() {}

(注意Foo::constant_string 的类型是char const* const 而不是char const[3]这是使用 auto 的效果.)

(Note that the type of Foo::constant_string is char const* const rather than, say, char const[3]; this is an effect of using auto.)

这篇关于为什么 C++11 'auto' 关键字对静态成员不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-27 21:05
查看更多