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 zu T [N] wie int& zu int .

    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, weil T [N] in einer Parameterliste nur eine andere Schreibweise für T* 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 nochmal
    

    Ist verwirrend, ist aber so.

    Und merke: in C++ kann man keine Arrays by value an Funktionen übergeben. Garnicht. Niemals.


Anmelden zum Antworten