Шаблон функции C ++ требует & для параметра массива - PullRequest
2 голосов
/ 16 июня 2020

В этом MCVE компилятор жалуется, что processArray не может соответствовать списку параметров (arr). Исправление заключается в замене T elements[SIZE] на T (&elements)[SIZE]. Зачем мне это нужно и при каких обстоятельствах? Обычно я бы не использовал & для передачи массива в функцию. (Единственная причина, по которой я подумал об этом, - это то, как новая версия istream& operator>> C ++ 20 описывает свой параметр char-array.)

template <typename T, int SIZE>
void processArray(T elements[SIZE])
{
    for (int i = 0; i < SIZE; ++i)
        elements[i] = 2;
}

int main()
{
    int arr[3];

    processArray(arr);

    return 0;
}

1 Ответ

5 голосов
/ 16 июня 2020

Это из-за распада массива . Если вы не передадите массив по ссылке, он превратится в указатель. Это означает, что

void processArray(T elements[SIZE])

на самом деле

void processArray(T* elements)

и нет способа узнать, что SIZE для вашего шаблона, поскольку указатель не знает размер массива, который он указывает на.

Как только вы сделаете параметр массива ссылкой, вы остановите его распад и сможете получить размер из массива, который передается в функцию.

...