2011-08-24 8 views
6

To pytanie pochodzi z tego:tablica nie rozkładowi do wskaźnika jeśli przeszły przez const odniesienia w funkcji szablonu

c++ pass array to function question

ale ponieważ PO przyjął odpowiedź Chyba nikt nie będzie go czytać teraz.

Próbowałem tego kodu na g ++. Wydaje się, że tablica nie rozpadają się wskaźnik, kiedy przeszedł do tej funkcji (funkcja zwraca prawidłowe wyniki):

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

Inny użytkownik (Sharptooth) powiedział, że mają ten sam problem na VC++ 10 z inline off.

Czy ktoś może wyjaśnić? Dzięki.

+0

Moje dzikie przypuszczenie jest takie, że 'T' przypomina typ' int [5] ', więc nie ma potrzeby zaniku wskaźnika. Ale nie jestem ekspertem. – Constantinius

Odpowiedz

12

Rozpad tablicowy się nie dzieje - zdarza się tylko wtedy, gdy program nie mógłby się bez niego skompilować. Gdy mijamy tablicę przez odniesienie, tam po prostu nie ma potrzeby rozpadu kopać w

Zauważ, że szablon funkcja może być również napisany bez podziału brzydkie sizeof wyrażeń:.

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

kiedy nazywa klient size_of_array , T i N są automatycznie wyprowadzane przez maszynę szablonów.

4

Nie napisałeś funkcji, aby zaakceptować wskaźnik, napisałeś go, aby zaakceptować odniesienie do stałego dokładnie tego typu argementu, które zostało mu przekazane. Zanik wskaźnika występuje tylko wtedy, gdy spróbujesz przypisać do wskaźnika wartość tablicy.

+0

Nie, po przypisaniu tablicy do wskaźnika - wskaźnik do tablicy nie zostanie skompilowany. – Puppy

+0

@DeadMG: Odczytujesz go "wskaźnik = tablica" == przypisanie wskaźnika do wartości tablicy. To miałem na myśli. –

Powiązane problemy