Можно ли использовать auto для определения переменной статического класса?

Рассмотрим этот простой пример:

struct Class {
    struct Inner {};
    static Inner a;
};

Я не могу определить это a с помощью этого синтаксиса:

auto Class::a = Inner{}; - gcc и msvc оба жалуются одинаково:

<source>:9:6: error: conflicting declaration 'auto Class::a'
    9 | auto Class::a = Inner{};
      |      ^~~~~
<source>:6:18: note: previous declaration as 'Class::Inner Class::a'
    6 |     static Inner a;
      |                  ^

но clang принимает этот код.

Конечно, причина этого синтаксиса в том, чтобы не повторять Class:: дважды:

Class::Inner Class::a{};

Итак, вопрос - это правильно (правильно clang) или неправильно (правы gcc и msvc)?

🤔 А знаете ли вы, что...
C++ обладает возможностью шаблонного программирования, что позволяет создавать обобщенные алгоритмы и структуры данных.


4
105
1

Ответ:

Решено

Это основная проблема #2389. Кланг прав, код действителен.

2389. Согласование выведенных и явно заданных типов переменных

Раздел: 9.2.9.7 [dcl.spec.auto]   Статус: CD6   Отправитель: Нина Раннс   Дата: 24 октября 2018 г.

Стандарт прямо не рассматривает вопрос о том, может ли такой пример, как следующее правильно сформировано или нет:

struct S {
  static int i;
};
auto S::i = 23;

При обработке этого примера существуют расхождения в реализации.

Заметки с заседания в июле 2019 г.

Редакционно добавьте пример как правильно оформленный; смотрите редакционный выпуск 2979.

РГС 16 сентября 2019 г.

Утверждено редакционное изменение 3227.

Он уже применен к C++20, как можно увидеть в [dcl.spec.auto.general]/p13.

Будучи статусом CD6 (CD6: проблема DR/DRWP или Accepted/WP, не решенная в C++20, но включенная в проект комитета, вынесенный на голосование на заседании WG21 в июле 2022 года), похоже, что GCC не реализовал его. еще.