perche questo codice:Array decadimento di puntatori in modelli
#include <iostream>
template<typename T>
void f(T x) {
std::cout << sizeof(T) << '\n';
}
int main()
{
int array[27];
f(array);
f<decltype(array)>(array);
}
Nota del redattore: il codice originale usato typeof(array)
, tuttavia, che è un'estensione GCC.
Ciò stamperà
8 (or 4)
108
Nel primo caso, la matrice decade ovviamente un puntatore e T diventa int*
. Nel secondo caso, T è forzato a int[27]
. L'ordine di decadimento/implementazione di sostituzione è definito? C'è un modo più elegante per forzare il tipo a int[27]
? Oltre a usare std :: vector?
Dove hai trovato un compilatore C++ dove 'sizeof (int) == 1'? Ottengo 108 per la seconda chiamata. –
Sì, ovviamente gcc ha già spostato fino a 4 byte interi ;-) Ho introdotto un bug durante la generazione di un testcase. – hirschhornsalz
Sono sorpreso della compilazione della seconda chiamata. Non è possibile passare array per valore in C++. [edit: Ah, 'T' ha il tipo di matrice, ma' sizeof (x) 'produrrebbe ancora 8 o 4. Non importa. :)] –