Как получается, что правильный способ написания на самом деле новый int[nRows][nCols]
?
Проще говоря, потому что вы можете заключать скобки в выражения (1 + 1
и * 1007) * оба действительны и имеют одинаковую оценку), но вы не можете ставить круглые скобки вокруг произвольных типов (int
является допустимым типом, но (int)
- нет).
В скобках внутри имени типа всегда есть функция semanti c (например, объявление указателя на функцию), они не просто группируют. cppreference имеет пример , иллюстрирующий это:
new int(*[10])(); // error: parsed as (new int) (*[10]) ()
new (int (*[10])()); // okay: allocates an array of 10 pointers to functions
Кроме того, синтаксис для записи объявлений типов (унаследованных от C) работает в спирали, направленные наружу по часовой стрелке . Обратите внимание, что переменная, для которой вы хотите выделить хранилище, объявлена как
int (*matrix)[nCols]
Переменная является частью innermost . И, наконец, указатель access в C (и C ++) отражает указатель объявление . Следовательно, выражение new[]
отражает синтаксис объявления, и, поскольку вы хотите выделить массивы nRow
stati c, количество выделяемых элементов сбрасывается в позицию объявления указателя ((*matrix)
).
Я советую против написания такого кода на C ++. Прежде всего, используйте constexpr
вместо const
здесь, хотя в данном конкретном случае голый const
остается действительным.
Но, что более важно, вы почти (?) Никогда не захотите использовать new
. Вместо того, чтобы вручную выделять массив, используйте std::vector
:
std::vector<int[nCols]> matrix(nRows);
// or:
std::vector<std::array<int, nCols>> matrix(nRows);