Я изучал синтаксис инициализатора в C++, и, согласно cppreference, есть три возможных способа его написания: 1) квадратные скобки, 2) знак равенства, 3) фигурные скобки.
При попытке инициализировать массив с синтаксисом 1) скобок я сталкиваюсь с ошибкой.
int test() {
int a[](1);
return 0;
}
Проверяя это в Compiler Explorer, я получаю от clang 11.0.0
error: array initializer must be an initializer list
int a[](1);
^
И аналогично на том же сайте с gcc 10.2
error: array must be initialized with a brace-enclosed initializer
Теперь я знаю, как использовать фигурные скобки для инициализации массива без ошибки. Но суть этого вопроса не в этом.
Я ищу соответствие стандарта С++ с этой ошибкой.
Я смотрю на этот стандартный черновик timsong-cpp (должно быть примерно 20 раз C++). Раздел "(17.1) Если инициализатор представляет собой (без скобок) скобочный список-инициализации или = скобочный-инит-список, ..." говорит о фигурных списках - не наш случай.
Затем идет раздел "(17.5) В противном случае, если целевой тип является массивом, объект инициализируется следующим образом..."
Я думаю, это должно покрыть наше дело. Речь идет об инициализации массива, это также раздел «иначе», что означает, что он не говорит о списках в фигурных скобках. Это может говорить о 1) квадратных скобках или 2) знаке равенства, но из дальнейшего текста мы видим, что для этого требуется список-выражение:
«Пусть x1, …, xk будут элементами списка-выражения».
Этот список выражений будет там при использовании синтаксиса скобок 1) . В качестве примечания, раздел «14 Если инициализируемый объект…» требует, чтобы в этом случае список выражений был только одним выражением.
Согласно стандартной формулировке, объявление int a[](1);
должно устанавливать длину массива равной 1 и инициализировать единственный его элемент значением 1. Но в реализациях этого не происходит.
Какие другие части стандарта могут помешать такой интерпретации? Или есть что-то еще, что мне не хватает?
Итак, моя ошибка заключалась в том, что я забыл добавить -std=c++20 для gcc.
Да, агрегатная инициализация со скобками — это функция C++20, вы можете прочитать больше на p0960r3. Поддерживается GCC10 >
Функция, которую вы пытаетесь использовать, была добавлена в C++20 и называется "Инициализация агрегатов в скобках". Как видно из страницы поддержки компилятора, GCC поддерживает это с GCC10, тогда как Clang пока не поддерживает эту функцию.
Спасибо, что указали, что это новая функция C++20. Я смотрел на стандарт С++ 20, но подумал, что это уже более старая функция.
Он отлично работает с g++ 10.2, как вы можете видеть godbolt.org/z/zcY3Mz. Вероятно, Clang еще не реализовал это.