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