Я изучал синтаксис инициализатора в 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 (должен быть примерно в C++ 20 раз). Раздел (17.1) Если инициализатор представляет собой (без скобок) скобочный список-инициализации или = скобочный-инит-список, ... говорит о фигурных списках - не наш случай.
Затем идет секция (17.5) В противном случае, если типом назначения является массив, объект инициализируется следующим образом...
Я думаю, это должно покрыть наше дело. Речь идет об инициализации массива, это также другой раздел, то есть он не говорит о списках в фигурных скобках. Это может говорить о 1) квадратных скобках или 2) знаке равенства, но из дальнейшего текста мы видим, что для этого требуется список выражений:
Пусть x1,...,xk — элементы списка-выражения.
Этот список выражений будет там при использовании синтаксиса скобок 1) . В качестве примечания, раздел 14 Если инициализируемый объект ... требует, чтобы в этом случае список выражений был только одним выражением.
Согласно стандартной формулировке, объявление int a[](1);
должно устанавливать длину массива равной 1 и инициализировать единственный его элемент значением 1. Но в реализациях этого не происходит.
Какие другие части стандарта могут помешать такой интерпретации? Или есть что-то еще, что мне не хватает?