Подтвердить что ты не робот

Почему ключевое слово С++ 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 +

4b9b3361

Ответ 1

Он не разрешен языком:

[C++11: 7.1.6.4]:

1 Спецификатор типа auto означает, что тип объявляемой переменной должен быть выведен из его инициализатора или что декларатор функции должен включать тип возвращаемого возвращаемого значения.

2 Спецификатор типа auto может появляться с помощью декларатора функции с возвращаемым типом возвращаемого типа (8.3.5) в любом контексте, в котором такой декларатор действителен.

3 В противном случае тип переменной выводится из ее инициализатора. Имя объявляемой переменной не должно появляться в выражении инициализатора. Это использование auto допускается при объявлении переменных в блоке (6.3), в области пространства имен (3.3.6) и в for-init-statement (6.5.3). auto должен отображаться как один из спецификаторов decl в спецификаторе-seq, а в указателе-спецификаторе-seq должен следовать один или несколько init-declarators, каждый из которых должен иметь непустой инициализатор.

4 Спецификатор типа auto также может использоваться при объявлении переменной в условии оператора выбора (6.4) или оператора итерации (6.5), в типе-спецификаторе-seq в идентификаторе нового типа или в типе-идентификаторе нового выражения (5.3.4), в объявлении для диапазона и при объявлении статического элемента данных с, который появляется в спецификации элемента определения класса (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.)

Ответ 2

Visual С++ принимает

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