void Foo(A*& obj): Warum muss A ein lvalue sein
-
Einfacher Code:
class A { }; void Foo(A*& obj) { } int main(int argc, char* argv[]) { A a; Foo(&a); return 0; }
Fehlermeldung:
Error 1 error C2664: 'Foo' : cannot convert parameter 1 from 'A *' to 'A *&' \cpptestbench.cpp 17
Ich verstehe es jedoch nicht ganz.
Sagen wir die Signatur von Foo ist fest. Warum kann ich keine Adresse eines Stack-Objekts nach Foo geben?Warum ist &a als nicht lvalue definiert?
Wenn ich einen künstlichen Pointer erzeuge, dann geht es:
A a; A* pA = &a; Foo(&a);
-
Seikilos schrieb:
Warum ist &a als nicht lvalue definiert?
Weil
&a = 0xBEEF
keinen Sinn macht.
-
Seikilos schrieb:
Sagen wir die Signatur von Foo ist fest.
Referenzparameter bedeutet stets, dass die Funktion ein Objekt als Argument erwartet. *
Seikilos schrieb:
Warum kann ich keine Adresse eines Stack-Objekts nach Foo geben?
Weil eine Adresse (genauer: ein Zeigerwert) kein Objekt darstellt. Zeigerobjekte enthalten Zeigerwerte und können an die Funktion übergeben werden.
const-lvalue-Referenzparamter oder rvalue-Referenzparameter erzeugen ggf. ein temporäres Objekt um dieser Bedingung zu genügen