Почему Clang решил разрешить назначенные инициализаторы в C++?
Я думал, что указанные инициализаторы были прекращены в C++ и работали только в C. Однако я натолкнулся на простой пример, который компилировался и прекрасно работал с clang ++.
int main()
{
int a[6] = { [4] = 29, [2] = 15 };
}
g ++: https://rextester.com/AXIZ79197 (ошибка)
clang ++: https://rextester.com/UYVHHP56966 (работает)
vC++: https://rextester.com/UCBEU10658 (ошибка)
И g ++, и vC++ не удалось скомпилировать, тогда как clang ++ работал просто отлично. Также стоит упомянуть, что g ++ и vC++ выдавали разные сообщения об ошибках. vC++ перепутал обозначенные инициализаторы с лямбда-выражениями. Я думаю, я мог бы обвинить в этом тот факт, что g ++ является более старым компилятором, но я не уверен, что это так.
Вопросы:
- Почему clang решил разрешить назначенные инициализаторы, а g ++ и vC++ этого не сделали?
- Это просто ошибка компилятора или есть другая причина для этого?
1 ответ
Когда скомпилировано с -pedantic
эти предупреждения генерируются:
source_file.cpp:3:18: warning: designated initializers are a C99 feature [-Wc99-extensions]
int a[6] = { [4] = 29, [2] = 15 };
^~~~~~~~
source_file.cpp:3:28: warning: designated initializers are a C99 feature [-Wc99-extensions]
int a[6] = { [4] = 29, [2] = 15 };
Ясно, что clang++
по умолчанию включает c99-extensions
,
Это не ошибка, так как компиляторы могут предоставить дополнительную функцию. clang++
разработчики просто решили оставить его включенным. Лучше использовать -pedantic
если мы не хотим эти функции.
Интересно, что при поиске соответствующей информации я наткнулся на страницу поддержки C++ в Clang, где "Назначенные инициализаторы" перечислены как частично поддерживаемые через расширение для будущих предложений:
экспериментальная поддержка некоторых предложенных функций стандарта C++ после C++17, условно названного C++2a
Это точное предложение для предстоящего стандарта. Так что в будущем C++ могут быть назначены инициализаторы.