Ich gehe derzeit durch r-Wert-Referenzen und verschiebe Semantik, und ich sehe eine seltsame Diskrepanz in meinen eigenen Codierungs-Experimenten.Warum kann ich bei Verwendung von std :: forward eine l-Wert-Referenzfunktion aufrufen, während ich einen r-Wert übergebe?
der folgende Code Gegeben:
#include <iostream>
using namespace std;
class X{};
void g(X&& t) // A
{
cout << "Rref call" << endl;
}
void g(X& t) // B
{
cout << "Lref call" << endl;
}
template<typename T>
void f(T&& t)
{
g(forward<T>(t));
}
int main()
{
X x;
f(x); // 1
f(X()); // 2
return 0;
}
Wird die erwartete Ausgabe hier erzeugen:
Lref nennt Rref zu nennen
Allerdings, wenn ich voran gehen und lösche die überladene Funktion g, die eine r-Wert-Referenz nimmt (oben auf Kommentarzeile // A bezeichnet), habe ich folgende Ausgabe:
Lref nennen
Wie funktioniert das aus Lref zu nennen? Warum beschwert sich der Compiler nicht über einen Anruf an g(X& t)
, während er versucht, eine X&&
zu übergeben?
Verwenden Sie Visual Studio? Wenn ja, hat es eine [nicht-standardmäßige Erweiterung] (http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to-a-temporary-object) zu Erlauben Sie Provisorien, an nicht-konstante Referenzen zu binden. Es schlägt fehl [in diesem Beispiel] (http://ideone.com/TcJbJA). –
James, das sieht genau so aus. War verrückt geworden und versuchte herauszufinden, was passiert ist. Herzlichen Dank. – Joefers