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]:

1 auto type-specifierは、宣言されている変数の型がその初期化子から推定されること、または関数宣言子が末尾のreturn-typeを含むことを意味します。

2auto 型指定子は、そのような宣言子が有効である任意のコンテキストで、末尾に戻る戻り型(8.3.5)を持つ関数宣言子とともに表示される場合があります。

3それ以外の場合、変数のタイプはその初期化子から推測されます。宣言されている変数の名前は、初期化式に表示されないものとします。この使用はauto、ブロック(6.3)、名前空間スコープ(3.3.6)、およびfor-init-statement(6.5.3)で変数を宣言するときに許可されます。decl-specifier-seqのdecl-specifiersの1つとして表示され、decl-specifier-seqautoに1以上のinit-declaratorsが続き、それぞれに空でない初期化子が必要です。

4 type-specifierは、選択ステートメント(6.4)または反復ステートメント(6.5)の条件で、new-type-idまたはtype-idtype-specifier-seqで変数を宣言する際にも使用できますauto new-expression(5.3.4)、for-range-declaration、およびクラス定義(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];これは使用の効果であるautoことに注意してください。)

于 2013-01-11T19:28:27.727 に答える
5

VisualC++は受け入れます

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