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


Anmelden zum Antworten