Что означает параметр printArray(int (&a)[n][m])
?
Это означает, что a
является ссылкой на объект типа int[n][m]
. int[n][m]
- это массив m
объектов типа int[n]
. int[n]
- это массив n
объектов типа int
. Так, a
является ссылкой на 2d массив с размерами n
и m
.
n
и m
являются аргументами шаблона, которые были объявлены в template <size_t n, size_t m>
. Тип обоих аргументов: size_t
, который является целочисленным типом.
Зачем нужны скобки
Потому что & -token привязывается слева. int&
является ссылкой на int. int& a[n]
будет синтаксически означать, что a
является массивом ссылок (хотя такие массивы недопустимы). Скобки используются для устранения неоднозначности, объявляет ли & -token ссылку (массив) на int или ссылку на массив.
и почему для функции printArray нужно указать только 1 значение?
У функции ровно один аргумент: a
. Если вы передаете значение, которое может быть связано с ссылкой на массив соответствующего типа, то это работает. Во всех ваших примерах аргументы - это двумерные массивы целых чисел, поэтому они верны.
как функция узнает n и m при вызове?
Компилятор знает, потому что размер массива является частью типа массива. И из-за вывода аргумента шаблона. Если аргумент шаблона не указан явно, он может быть выведен из аргументов функции. В этом случае, если вы передаете аргумент типа int[2][5]
, то n
определяется как 2, а m
выводится как 5.
Вы можете даже добавить аргумент типа шаблона и сделать вывод:
template <size_t n, size_t m, typename T>
void printArray(T (&a)[n][m])
T
будет выведено равным int
, если вы передадите двумерный массив целых чисел.
если массив ссылок не разрешен, почему компилятор не может сделать вывод, что скобки не нужны.
Если int &a[n]
будет означать ссылку на массив, так как не может быть массивов ссылок, то это может сбить с толку программистов, что int *a[n]
не является указателем на массив, потому что могут быть массивы указателей.
Кроме того, это усложнит язык, добавив специальный регистр для ссылок, которые не нужны.
почему не форма: printArray (int [n] [m] & a)
Проще говоря, почему массивы не могут быть объявлены int[n] a
вместо int a[n]
. Потому что последний синтаксис был выбран (предположительно Деннисом Ричи, когда он был) разработчиком языка Си.