Почему я получаю ошибку «объявление в виде массива ссылок», когда я использую оператор ссылки без скобок в параметре 2D-массива? - PullRequest
0 голосов
/ 05 октября 2018

Я понимаю, что C ++ передает массивы по ссылке, даже если мы не используем оператор ссылки (&), но, поскольку он может быть добавлен без вреда (я думаю), мне любопытно, почему этот код генерирует

объявление 'матрицы' в виде массива ссылок

void function (int &matrix[2][5])  {
    //something
}

int main()  {
    int matrix[2][3] = {{1,2,3}, {4,5,6}};
    function(matrix);
}

при добавлении скобок в (&matrix) работает:

void function (int (&matrix)[2][5])  {
    //something
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я понимаю, что C ++ передает массивы по ссылке, даже если мы не используем оператор ссылки (&)

Это неверно.C ++ не передает массивы в качестве ссылок.Кроме того, не существует такого понятия, как «оператор ссылки».


Мне любопытно, почему этот код выдает

Код не «выбрасывает», этот термин используется в контексте исключений.Вы просто получаете ошибку компиляции, когда пытаетесь определить массив ссылок на целые числа.

Это происходит потому, что

int &matrix[2][5]

сгруппирован как

int &((matrix[2])[5])

по умолчанию.Добавление круглых скобок заставляет компилятор анализировать ваш тип как «ссылку на массив целых чисел».

0 голосов
/ 05 октября 2018

&matrix[2][5] имеет значение, отличное от (&matrix)[2][5]).

Первое означает matrix - это двумерный массив ссылок на int , а второе означает matrix - это ссылка на двумерный массив целых чисел .

Поскольку matrix определен как двумерный массив в main, вторая форма завершается успешно.

Инструмент cdecl может быть полезен здесь:

int (&matrix)[2][5] - declare matrix as reference to array 2 of array 5 of int
int &matrix[2][5] - declare matrix as array 2 of array 5 of reference to int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...