Lassen Sie uns sagen, ich habe diese Funktion:Verhalten von C++ Template-Funktion
bool f(int&& one, int&& two) { }
Wenn ich versuche, es mit diesem Code zu nennen:
int x = 4;
f(x, 5);
der Compiler wird sich beschweren, dass es nicht x von L-Wert umwandeln kann Verweis auf Rvalue-Referenz, die korrekt ist.
Nun, wenn ich f in eine Template-Funktion wie folgt konvertieren:
template <class T, class U>
bool f(T&& one, U&& two) { }
dann kann ich es mit einem L-Wert-Referenz nennen:
int x = 5;
f(x, 5);
Warum ist es so? Warum beschweren sich die Compiler in diesem Fall nicht?
Während das Referenz-Kollabieren im Fall einer "universellen Referenz" auftritt, tritt die wahre Magie vor diesem Schritt auf und tritt während der Template-Argumentableitung auf. Ihre Anmerkung zum Kollabieren von Referenzen, die nicht in einer normalen Funktion funktionieren, ist einfach falsch. Das kollabierende Referenzieren kann überall passieren: 'using T = int &&; void foo (T & x); 'hier x ist ein' int & 'aufgrund der kollabierenden Referenz. – Simple
@Simple sieht aus wie rechts, ich wusste bereits, dass decltypes und auto Referenz kollabieren konnte, wusste nicht, dass ein typedef es verursachen könnte, ich Ich werde meine Antwort ändern – aaronman