Ich habe Mühe zu verstehen, was genau passiert, wenn eine Referenz an eine Funktion als universelle Referenz übergeben wird (welcher Typ abgeleitet wird). Nehmen wir an, wir eine Funktion foo haben, die einen param als universelles Referenz nimmt:Übergeben einer Referenz an die Funktion als universelle Referenz
template<typename T>
void foo(T&& param)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
Und dann lassen Sie uns wie folgt vor:
void(&f)(int) = someFunction;
foo(f);
Das Ergebnis wird sein:
void foo(T&&) [with T = void (&)int]
Das ist vollkommen verständlich: Wir übergeben lvalue an unsere Funktion foo, also ist der abgeleitete Typ ungültig (&) int, und der Typ des Parameters wird "void (& & &) int" sein, was unter den Regeln zum Kollabieren von Referenzen ungültig wird (&) int. Param ist nur ein lvalue Verweis auf eine Funktion.
Aber wenn ich folgendes tun:
void(&f)(int) = someFunction;
foo(std::move(f));
foo gedruckt wird:
void foo(T&&) [with T = void (&)int]
, die nach wie vor genau gleich ist! Was passiert hier? Warum ist das Ergebnis dasselbe wie beim Übergeben von Lvalue? Ich würde erwarten, dass, da wir rvalue zu foo übergeben, der abgeleitete Typ T = void (int) sein sollte, und param sollte ungültig werden (& &) int. Dies passiert immer bei allen anderen "normalen" Typen (wie Klassen, primitiven Typen usw.). Warum unterscheidet es sich bei den Funktionsreferenzen?
Nein. 'param' hat einen Namen, per Definition ist es ein Wert. –
@KerrekSB Sorry, aber das ist falsch - http: // stackoverflow.com/questions/7016777/was-ist-ein-rvalue-Referenz-zu-Funktion-Typ –
@rubix_addict: Mein schlechtes, danke! Entfernt. Ich war hinter der Aussage, die Teil der Antwort ist, aber ich habe es nicht richtig verstanden. –