2011-08-24 8 views
6

Esta pregunta viene de éste:matriz no se descompone a puntero de ser aprobada por referencia constante en una función de plantilla

c++ pass array to function question

pero desde el OP aceptó una respuesta supongo que nadie lo va a leer ahora.

Probé este código en g ++. Parece que la matriz no se descompone a un puntero cuando se pasa a esta función (la función devuelve el resultado correcto):

#include <iostream> 

template <typename T> 
std::size_t size_of_array (T const & array) 
{ 
    return sizeof (array)/sizeof (*array); 
} 

int main() 
{ 
    int a [5]; 
    std::cout << size_of_array (a) << '\n'; 
} 

Otro usuario (sharptooth) dijo que tiene el mismo comportamiento en VC++ 10 con inlining fuera.

¿Alguien puede explicarlo? Gracias.

+0

Mi conjetura salvaje es que 'T' se parece al tipo' int [5] ', por lo que no hay necesidad de un decaimiento a un puntero. Pero no soy un experto – Constantinius

Respuesta

12

La desintegración de matriz no ocurre solo; solo ocurre cuando el programa no puede compilar sin ella. Cuando se pasa una matriz por referencia, simplemente no hay necesidad de que la caries se produzca,

Tenga en cuenta que la plantilla de función también se puede escribir sin dividir feas sizeof expresiones:.

template <typename T, std::size_t N> 
std::size_t size_of_array(T (&array)[N]) 
{ 
    return N; 
} 

cuando un cliente llama size_of_array , T y N se deducen automáticamente por la maquinaria de la plantilla.

4

No ha escrito la función para aceptar un puntero, lo ha escrito para aceptar una referencia directa al tipo exacto de texto que se le ha pasado. La disminución del puntero solo ocurre si intenta asignar a un puntero el valor de una matriz.

+0

No, cuando asigna una matriz a un puntero, no se compilará un puntero a una matriz. – Puppy

+0

@DeadMG: Lo está leyendo al revés "puntero = matriz" == asignando un puntero al valor de una matriz. Eso es lo que quiero decir. –

Cuestiones relacionadas