2015-06-13 12 views

risposta

10

E 'una scorciatoia per qualcosa di simile:

template <typename T, size_t N> 
constexpr size_t size_of(T (&anonymous_variable)[N]) { 
    return N; 
} 

Nella funzione, in realtà non è necessario il nome della variabile, solo il modello di deduzione N - in modo che possiamo semplicemente scegliere di omettere esso. Le parentesi sono sintatticamente necessarie per passare l'array in base al riferimento - non è possibile passare in un array in base al valore.

+0

Grazie! Questo modello ha un nome? – Phonon

+0

@Phonon Non che io sappia. – Barry

+3

@Phonon: è una sintassi standard che esiste dal momento che l'antica C. C non ha riferimenti, ma i tipi di puntatori di array sono stati descritti come 'T (*) [N]' dall'inizio dei tempi. La sostituzione di '*' con '&' è oltre il punto. – AnT

4

Questo sta passando un array come parametro di riferimento:

template <typename T, size_t N> 
constexpr size_t size_of(T (&)[N]) { 
    return N; 
} 

Poiché non è possibile passare un array come questo:

template <typename T, size_t N> 
constexpr size_t size_of(T[N]) { 
    return N; 
} 

Se l'array è stato dato un nome, sarebbe simile :

template <typename T, size_t N> 
constexpr size_t size_of(T (&arrayname)[N]) { 
    return N; 
} 
+0

Perché il blocco centrale è illegale? – Phonon

+0

@ Gli array Phonon non possono essere passati per riferimento; sono passati per valore. – Joe