ich den folgenden Code mit GCC, Clang, ICC und VS getestet:Kann eine Rvalue-Referenz an eine Funktion gebunden werden?
void f() {}
void g(void (&&)()) { }
int main() {
g(f);
}
Wie wir sehen können, g
nimmt eine rvalue Referenz aber f
ist ein L-Wert und im Allgemeinen kann rvalue Referenzen nicht zu lvalues gebunden werden . Das ist genau das, was ICC klagt über:
error: an rvalue reference cannot be bound to an lvalue
VS gibt auch ein Fehler aber aus einem anderen Grund:
error C2664: 'void h(void (__cdecl &&)(void))' : cannot convert parameter 1 from 'void (__cdecl *)(void)' to 'void (__cdecl &&)(void)'
Dies legt nahe, mir, dass VS sofort führt eine Funktion zu Zeiger Umwandlung, anstatt direkt die Referenz an f
zu binden. Es ist erwähnenswert, dass, wenn ich g(f)
durch g(&f)
ersetze, die vier Compiler genau diesen gleichen Fehler ergeben.
Schließlich GCC und Clang akzeptieren den Code und ich glaube, dass sie korrekt sind. Meine Überlegung basiert auf 8.5.3/5
A reference „CV1 T1“ zu geben, indem ein Ausdruck des Typs „CV2 T2“ als
initialisiert wird - Wenn die Referenz ein L-Wert Referenz [ist. ..]
- Andernfalls [...] soll die Referenz eine R-Referenz sein.
- Wenn der Initialisierer Ausdruck ist ein [...] Funktion lvalue [...]
dann die Bezugnahme auf den Wert des gebundenen Initialisierungsausdruck [...]
Ist meine Interpretation korrekt (dass sind Clang und GCC aus dem genannten Grund konform)?
der Tat. Ich habe das vorher getestet und alle vier Compiler sind konform. –
@CassioNeri: OK, danke für das Teilen der Informationen –