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.