Esta pregunta se trata de funciones que toman matrices de tamaño estáticamente conocido.La diferencia entre int a [5] e int (& a) [5] en la deducción del parámetro de plantilla
Tomemos como ejemplo el siguiente programa mínimo:
#include <iostream>
template<size_t N>
void arrfun_a(int a[N])
{
for(size_t i = 0; i < N; ++i)
std::cout << a[i]++ << " ";
}
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
arrfun_a<5>(a);
std::cout << std::endl;
arrfun_a<5>(a);
return 0;
}
Lo cual, cuando se ejecuta, imprime el resultado esperado:
2 3 4 5 6
3 4 5 6 7
Sin embargo, cuando traté de tener mi compilador (VS 2010) deducir el 5
, es could not deduce template argument for 'int [n]' from 'int [5]'
.
Un poco de investigación dio como resultado la arrfun_b
actualizada cuando la deducción parámetro de plantilla funciona:
template<size_t n>
void arrfun_b(int (&a)[n])
{
for(size_t i = 0; i < n; ++i)
std::cout << ++(a[i]) << std::endl;
}
El resultado del programa es el mismo, ya sea arrfun_a
o arrfun_b
se llama.
Hasta ahora, la única diferencia que he encontrado es si la deducción argumento de plantilla funciona y si es posible llamar la función con una N que no es de 5 ...
¿Estás seguro de que "ambas versiones permiten pasar explícitamente una N que es más pequeña o más grande"? No debería y [no] (http://ideone.com/74FaV) para mí. Y es otro _pro_ usar la versión de referencia – Lol4t0
¡Gracias por arreglar mi confusión! En algún lugar durante la prueba, ¡debo haberlo arruinado! –
No debe eliminar la versión que no es de referencia y creó una sobrecarga, que se llamó. – Lol4t0