Рассмотрим этот простой пример:
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)?
@wohlstad Самая последняя формулировка — там . AFAIU (не очень далеко;)): auto в принципе можно найти в контексте объявления, а не определения. Диагностика компиляторов, похоже, идет следующим образом ( godbolt.org/z/8qM19T345 и вопрос): они видят (пере)объявление.





Это основная проблема #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 не реализовал его. еще.
gcc и MSVC правы в соответствии с принятым ответом здесь. Но учтите, что этому сообщению более 10 лет и оно относится к C++11, с тех пор могли произойти некоторые изменения.