C23 авто против C++11 авто

В стандарте C23, по-видимому, введено использование ключевого слова «auto» для автоматического определения типа, см. здесь, как и в C++11. Однако, похоже, есть некоторые различия.

Согласно здесь, https://en.cppreference.com/w/cpp/keyword/auto после C++11 больше не является спецификатором продолжительности хранения в C++.

Однако я не могу легко найти эквивалентное утверждение для C23. Неужели это так, чтоautoпо-прежнему является спецификатором класса хранения в C в C23?

Можем ли мы еще написатьint auto x = 1;в С23?

РЕДАКТИРОВАТЬ: Ответ на первый вопрос — да. Но, как отметил Эндрю Хенле в комментариях ниже, второй вопрос другой:

Можем ли мы по-прежнему писать на C23?

Как цитируют @AndrewHenle и @VladfromMoscow, в стандартном документе 6.7.1 Спецификаторы класса хранения, параграф 4.

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

Похоже дело не в этомfloat auto x = 1;, если это объявление не находится в области файла.

Какова это интерпретация?

Есть еще один вопрос: это предложение кажется запутанным, потому что мы наверняка можем использовать auto без «других спецификаторов хранилища», не так ли? Нравитьсяauto a = 1;.

3 ответа

Да, это по-прежнему спецификатор класса хранилища в C23:

См. 6.7.1 Спецификаторы класса хранения :

  • auto
  • constexpr
  • extern
  • register
  • static
  • thread_local
  • typedef

В C23 auto по-прежнему является спецификатором класса памяти.

Из C 23 (6.7.1 Спецификаторы класса хранения)

Синтаксис

      1 storage-class-specifier:
    auto
    constexpr
    extern
    register
    static
    thread_local
    typedef

и

Семантика

6 Спецификаторы класса хранения определяют различные свойства идентификаторов и объявленные функции:

— продолжительность хранения (статическая в области блока, thread_local, auto, Register),

4 thread_local не должен появляться в спецификаторах объявления объявления функции. auto должен появляться только в спецификаторах объявления идентификатора с областью действия файла или вместе с другими спецификаторами класса хранения, если тип должен быть выведен из инициализатора.

действителен и означает то же самое, что и в версии до C23 (и здесь так же избыточно, как и в версии до C23). В рабочем проекте нет никаких указаний на то, что это может быть не так.

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

Это не распространяетсяfloat auto x = 1;в области видимости функции. В этом объявлении по-прежнему указывается продолжительность хранения, поскольку:

Спецификаторы класса хранения определяют различные свойства идентификаторов и объявленных функций:

  • продолжительность хранения (статическая в области блока, thread_local, auto, Register),

и это значение не игнорируется, потому что

Если auto появляется с другим спецификатором класса хранения или если оно появляется в объявлении в области файла, оно игнорируется в целях определения продолжительности хранения или связи.

иautoне указывает, что тип должен быть выведен, потому что

Для объявления, в котором спецификаторы объявления не содержат спецификатора типа, механизм вывода типа из инициализатора обсуждается в 6.7.9.

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