Template Type Deduction und top-level CV qualifier



  • Seit wann können deduzierte Typen top-level CV-Qualifier haben? Ich hatte stets den Eindruck (seit C++98), dass deduzierte Template-Typ-Argumente keine CV-Qualifier haben können; egal, ob sie aus T, T&, T*, const T&, ... deduziert wurden. Zu meinem Erstaunen musste ich aber feststellen, dass sie das wohl können:

    template<typename T>
    void f(T& x)
    {
    }
    
    int main()
    {
        const int x = 1;
        f(x);
    }
    

    Ich dachte ferner, das sei ein Grund, wieso die Forwarding References von C++11 so gut sind: weil sie CV-Qualifier übernehmen. Das tun aber schon normale lvalue-Referenzen von C++98, scheinbar.


  • Mod

    Seit wann können deduzierte Typen top-level CV-Qualifier haben?

    Schon immer. Es geschieht nicht bei einem value parameter wie T t , weil es irrelevant ist: const muss der Parameter nur sein, wenn der Autor es so will, aus Bequemlichkeit.

    Der Standard spezifiziert das in [temp.deduct.call]/(2.3). Diese Regel findet sich in viel früheren Drafts (bspw. ~2005) an der selben Stelle.


Anmelden zum Antworten