2011-08-24 6 views
6

Questa domanda viene da questo:matrice non decade di puntatore se passato per riferimento const in una funzione template

c++ pass array to function question

ma dal momento che il PO ha accettato una risposta credo che nessuno lo leggerà ora.

Ho provato questo codice su g ++. Sembra che l'array non decade in un puntatore quando viene passato a questa funzione (la funzione restituisce il risultato corretto):

#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'; 
} 

Un altro utente (sharptooth) detto che hanno lo stesso comportamento VC++ 10 con inlining off.

Qualcuno può spiegare? Grazie.

+0

La mia ipotesi è che "T" somigli al tipo "int [5]", quindi non c'è bisogno di un decadimento su un puntatore. Ma non sono esperto. – Constantinius

risposta

12

Il decadimento delle matrici non si verifica solo - accade solo quando il programma non riesce a compilare senza di esso. Quando si passa una matrice per riferimento, non semplicemente c'è bisogno di decadimento a calciare in

Si noti che il modello di funzione può anche essere scritta senza dividere brutte sizeof espressioni:.

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

Quando un client chiama size_of_array , T e N vengono dedotti automaticamente dal macchinario modello.

4

Non hai scritto la funzione per accettare un puntatore, lo hai scritto per accettare un riferimento const esattamente al tipo di argement che gli è passato. Il decadimento del puntatore avviene solo se si tenta di assegnare a un puntatore il valore di un array.

+0

No, quando si assegna un array a un puntatore, un puntatore a un array non verrà compilato. – Puppy

+0

@DeadMG: stai leggendo all'indietro "pointer = array" == assegnando un puntatore al valore di un array. Questo è ciò che intendo. –

Problemi correlati