Verständnissproblem bei Template-Funktion
-
template<typename T,std::size_t N> inline std::size_t array_size(T (&)[N]) { return N; }Hallo,
ich versteh bei diesem Code oben nicht ganz was T (&)[N] bedeutet
bzw. warum sich folgender Code nicht kompilieren lässt:template<typename T,std::size_t N> inline std::size_t array_size(T Array[N]) { return N; }Danke
-
T (&)[N]ist zuT [N]wieint&zuint.Die Klammern sehen da komisch aus, sind aber nötig, weil ohne Klammern wär's nunmal keine Referenz auf ein Array, sondern ein Array aus Referenzen.
Und
T [N]geht nicht, weilT [N]in einer Parameterliste nur eine andere Schreibweise fürT*ist. N ist dabei vollkommen beliebig, und "verschwindet" aus dem Typ des Parameters. Daher kann N hier auch nicht aus irgendeinem Template-Parameter deduziert werden.Beispiel:
void foo(int*) {} // OK void foo(int [10]) {} // Fehler: ist die gleiche Funktion wie foo(int*) void foo(int [20]) {} // Fehler: immer noch gleichbedeutend mit foo(int*) void foo(int []) {} // ...und nochmalIst verwirrend, ist aber so.
Und merke: in C++ kann man keine Arrays by value an Funktionen übergeben. Garnicht. Niemals.