Dies ist ein Followup von function template does not recognize lvalueVerständnis Vorlage Argument Abzug mit rvalue/L-Wert
Fangen wir mit dem folgenden Code spielen:
#include <iostream>
template <class T>
void func(T&&) {
std::cout<<"in rvalue\n";
}
template <class T>
void func(const T&) {
std::cout<<"in lvalue\n";
}
int main()
{
double n=3;
func<double>(n);
func(n);
}
Er druckt:
in lvalue
in rvalue
Ich verstehe nicht, was passiert im zweiten Anruf. Wie der Compiler den Template-Parameter auflösen? Warum gibt es keine Zweideutigkeit?
Sie können 14.8.2 im Standard konsultieren. Template Argument Abzug ist ein etwas komplexes Thema. Der Punkt ist, dass die "beste Übereinstimmung" gewählt wird, und dass "T" als Referenztyp abgeleitet werden kann. –
"etwas komplexes Thema"! Ich stimme vollkommen zu. Übrigens, gibt es eine Möglichkeit, g ++/clang ++ zu fragen, worum es hier geht? – hivert
Diese unschuldige kleine Untersektion nimmt 15 Seiten ein und entwickelt eine ganz neue mathematische Notation: -S Aber letztlich "macht was du denkst", du musst nur Template-Parameter als ehrliche Typen im Kontext einer Funktionssignatur annehmen. –