Можно ли использовать 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)?

gcc и MSVC правы в соответствии с принятым ответом здесь. Но учтите, что этому сообщению более 10 лет и оно относится к C++11, с тех пор могли произойти некоторые изменения.

wohlstad 02.07.2024 14:51

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

Oersted 02.07.2024 15:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 не реализовал его. еще.

Другие вопросы по теме