Pregunta Por qué una función de plantilla recibe una matriz 2D con referencia 1D cuando una función normal no lo hace


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 !!!??
}

Puedo esperar que fun() da error, pero como viene funT() ¡funciona bien! ¿Hay alguna referencia en la norma para tal comportamiento o Es un error en lenguaje C ++?


5
2018-05-25 11:41


origen


Respuestas:


Porque el tipo de c no es char [2], no coincide con el primero función. En el caso de la plantilla, T resuelve a char [2], lo que significa que el tipo de argumento final es char (&a)[2][2]. (Puedes pensarlo como el T convirtiéndose en el equivalente de una typedef a char[2]y expandir el tipo de argumento basado en eso.)


11
2018-05-25 11:50



T resolverá a char*char[2] y como tal no debería haber ningún problema con su función de plantilla.

Edit: Gracias James por señalarlo.


1
2018-05-25 11:44