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.
-
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.