Почему функция шаблона получает двумерный массив с 1D ссылкой, а обычная функция не - PullRequest
5 голосов
/ 25 мая 2011
void fun (char (&a)[2])  // 1D reference
{}

template<typename T, int SIZE>
void funT (T (&a)[SIZE])  // 1D reference
{}

int main ()
{
  char c[2][2];  // 2D array
  fun(c);  // error
  funT(c); // ok !!!??
}

Я могу ожидать, что fun() выдает ошибку, но как получается funT() работает нормально! Есть ли в стандарте ссылка на такое поведение или Это ошибка в языке C ++?

Ответы [ 2 ]

11 голосов
/ 25 мая 2011

Поскольку тип c не char [2], он не соответствует первому функция. В случае шаблона T разрешается до char [2], что означает что последний тип аргумента char (&a)[2][2]. (Вы можете думать об этом как T становится эквивалентом typedef до char[2], и расширить тип аргумента на основе этого.)

1 голос
/ 25 мая 2011

T будет преобразовано в char*char[2], и поэтому не должно быть никаких проблем с вашей шаблонной функцией.

Редактировать: Спасибо Джеймсу за то, что указал на это.

...