R value requires LValue



  • @Helmut-Jakoby denke Mal schon, ich gebe eine variable zurück, die in der Funktion entstanden ist (Stack)



  • @Gamestarplayer41 sagte in R value requires LValue:

    @DirkB ist eigentlich eine allgemeine Frage

    @Gamestarplayer41 sagte in R value requires LValue:

    @Helmut-Jakoby denke Mal schon, ich gebe eine variable zurück, die in der Funktion entstanden ist (Stack)

    Und jetzt erwartest du Hilfe?



  • @Gamestarplayer41 sagte in R value requires LValue:

    ist eigentlich eine allgemeine Frage

    Dann bekommst du hier mal eine allgemeine Antwort: Lies bitte https://en.cppreference.com/w/cpp/language/value_category

    Da steht alles über rvalues, lvalues usw. drin.

    Edit: oder du schaust mal hier: http://open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4861.pdf Kapitel 7.2 (Seite 87). Oder du guckst dir das Video hier an: https://www.youtube.com/watch?v=XS2JddPq7GQ (ich habs selbst nicht gesehen).

    Jedenfalls sollte mit dem Verständis darüber die Fehlermeldung hoffentlich klar sein.



  • @Gamestarplayer41 sagte in R value requires LValue:

    Hey,
    Ich stoße öfters auf den oben genannten Fehler (oder so ähnlich). [...]
    Der tritt immer auf, wenn ich einen Pointer auf Return von einer Funktion zeigen lasse.

    Dann machst du an der Stelle etwas verkehrt. Wahrscheinlich grundsätzlich, sonnst würde das nicht öfter passieren.

    Wenn du wissen möchtest, was du falsch machst, solltest du den fehlerhaften Code zeigen.



  • @DirkB naja ich bin noch blutiger Anfänger 😂 der Code sieht so aus:

    int Foo(){
    Int a=1;
    Return a;
    }
    int main (){
    Std::cout<< *Foo();
    }
    

    (Am handy getippt, hab Grad keine Möglichkeit am PC zu sitzen)

    Mir geht's eher drum was passiert da genau, existiert.
    Kann Grad sein, dass der Code so perfekt funktioniert, oftmals passiert mir das in meinen selbst überladenen Operatoren oder wenn ich Pointer benutzen möchte.



  • @Gamestarplayer41 sagte in R value requires LValue:

    int main (){
    Std::cout<< *Foo();
    }

    Naja, was soll der * da tun? Foo liefert einen int zurück und keinen Pointer. Du kannst da also keinen Pointer dereferenzieren.



  • @Gamestarplayer41

    Das wäre wie i = &12 // Adressoperator bei Literal



  • Er meint & statt *

    int* p = &atoi("123");
    

    War mir auch nach dem Lesen des 1. Beitrags klar. Nur der Punkt ist: er sollte sich abgewöhnen Fehlermeldungen aus dem Gedächtnis abzuschreiben, speziell wenn er dabei alles durcheinander würfelt.

    "Ey, ich bekomm da so nen Fehler so irgendwas mit R value und geht nicht und so, was mach ich denn da falsch?"
    🤦🏻♂

    Sorry, aber das ist ein Beitrag auf den man mMn. keine sinnvolle Antwort bekommen sollte. Weil man sonst nie lernt Fragen ordentlich zu stellen.



  • @hustbaer sagte in R value requires LValue:

    War mir auch nach dem Lesen des 1. Beitrags klar.

    Das war auch meine Vermutung, aber damit konnte ich obige keine Fehlermeldung mit rvalue und lvalue reproduzieren. Sowas ergibt "error: lvalue required as unary '&' operand" (gcc) oder "error C2102: '&' requires l-value" (msvc) oder "cannot take the address of an rvalue of type 'int'" (clang). In keinem Fall "RValue requires LValue". Daher hatte ich diese Idee verworfen.



  • @wob
    Vielleicht meint er auch

    <source>: In function 'void square(int)':
    <source>:8:18: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
        8 |     int& p = atoi("123");
          |              ~~~~^~~~~~~
    Compiler returned: 1
    

    Bleibt sich im Endeffekt aber egal, da der Grund warum es nicht geht der selbe ist.

    Das Hauptproblem ist aber wie schon erwähnt dass es nicht sinnvoll ist Fehlermeldungen aus dem Gedächtnis abzuschreiben. Ausser man ist mit einem eidetischen Gedächtnis gesegnet - nur da ist beim OP ziemlich klar nicht der Fall.



  • @hustbaer

    Ich wiederhole mich evtl. nochmal. Ich frage hier Allgemein was das zu bedeutet hat, nicht wie man das behebt... Ich bin schon noch in der Lage das zu beheben o.O

    Fragte mich aber WARUM

    Selbst Gutefrage weist weniger Toxizität auf und jammert sofort rum. Manche schreiben nur "brauche hilfe bei Java" das wars. Trotzdem wird oft freundlich geholfen. Aber scheint wohl bei dir so zu sein, dass dein Selbstbewusstsein einzig allein auf dem Nieder machen blutiger anfänger zu basieren scheint. Ein wenig traurig irwie, aber manche brauchen wohl dieses Macht Gefühl xDDD

    Bei Anfängern muss man halt mit gewissen Kommunikationsschwierigkeiten rechnen. Wenn man darauf kein bock hat lieber die klappe halten... Als ob deine Art so noch weiterhilft...

    Ich verpiesel mich wieder aus diesem Forum, da bin ich besser aufgehoben auf Gutefrage, dort gibts wenigstens auch kompetente leute.

    @DirkB ist noch relativ nett und gibt ein Beispiel

    Adé



  • Ich wiederhole mich evtl. nochmal. Ich frage hier Allgemein was das zu bedeutet hat, nicht wie man das behebt...

    Verstehe echt nicht, wo dein Problem ist. Ist habe dir die Dokumentation & ein Video verlinkt, wo die Begriffe RValue und LValue erklärt werden (und @Helmut-Jakoby hat das in weniger technisch auch gemacht), damit du die Fehlermeldung verstehen kannst.

    Falls du das noch liest: du bekommst hier sehr gute Hilfe, wenn du besser/konkreter fragst. Am besten mit Beispiel und dem, was du erreichen willst. - wobei, du sagst ja, dass du es sowieso selbst beheben kannst. Na dann...



  • @Ein-ehemaliger-Benutzer sagte in R value requires LValue:

    Aber scheint wohl bei dir so zu sein, dass dein Selbstbewusstsein einzig allein auf dem Nieder machen blutiger anfänger zu basieren scheint. Ein wenig traurig irwie, aber manche brauchen wohl dieses Macht Gefühl xDDD

    Du hast nicht verstanden worum es geht. Es geht nicht darum dass du was nicht weisst. Es geht darum dass du es nichtmal für nötig befindest die Fehlermeldung 1:1 so in die Frage zu schreiben wie sie bei dir am Bildschirm steht.

    Das ist einerseits frech, weil es bedeutet dass es für dich völlig OK ist wenn andere Zeit damit verschwenden zu versuchen zu erraten was du gemeint haben könntest -- anstatt dass du dir selbst die wohl unerträgliche Mühe machst eine Fehlermeldung aus der IDE ins Forum zu kopieren.

    Und andrerseits ist es auch für dich hinderlich. Weil du dir damit keine Freunde machst und weil dieses "rumraten müssen" nicht immer erfolgreich ist. D.h. du bekommst weniger und schlechtere Antworten.

    Bei Anfängern muss man halt mit gewissen Kommunikationsschwierigkeiten rechnen.

    Ja. Aber nicht mit solchen. Zumindest nicht nachdem man diese Anfänger darauf hingewiesen hat was sie falsch machen. Bloss das bringt bei dir nix. Weil du halt leider nicht kritikfähig bist.

    Wenn man darauf kein bock hat lieber die klappe halten... Als ob deine Art so noch weiterhilft...

    Ach doch ja, sie würde schon weiterhelfen. Bloss schaffst du es nicht über deinen Schatten zu springen und einzusehen was du falsch gemacht hast.

    Ich verpiesel mich wieder aus diesem Forum

    Ist OK. Ein Depp weniger.



  • @hustbaer sagte in R value requires LValue:

    dass es für dich völlig OK ist wenn andere Zeit damit verschwenden zu versuchen zu erraten was du gemeint haben könntest

    Und darauf kommt in der Regel:

    Du musst ja nicht antworten, es zwingt dich ja niemand.

    Worauf man dann nur sagen kann: "Schön, du OP musst ja auch keine Frage stellen." Geht an die Adresse jener die eine ähnliche Einstellung haben wie der OP.



  • @hustbaer sagte in R value requires LValue:

    Du hast nicht verstanden worum es geht. Es geht nicht darum dass du was nicht weisst. Es geht darum dass du es nichtmal für nötig befindest die Fehlermeldung 1:1 so in die Frage zu schreiben wie sie bei dir am Bildschirm steht.

    Problem ist, das auch solch grundsätzliche Sachen erst mal erklärt werden müssen. Die Leute kommen leider nicht auf die Welt und denken sich, "die nächste Fehlermeldung mache ich copy und paste", sondern müssen auch erst das lernen.

    Natürlich versteht jeder, das es müßig ist, solche Sachen immer und immer wieder zu wiederholen. Aber erst muss man es gelernt haben.

    Warum man aber dann so schnapsig reagiert, keine Ahnung, ich hatte anfangs auch ... aber dingsbums, anderes Thema.



  • Auch ein Klassiker:

    OP Ich hab hier diesen Code <snip> der Zeigt Verhalten <snip>, warum ist das so?
    X Der Code kann nicht verhalten <snip> haben, der kompiliert ja nichtmal. <Erklärung warum modifizierten Code posten scheisse ist>
    OP Kompiliert wohl, darum geht's aber nicht.
    X Nein, in Zeile <snip> steht <snip> und das ist falsch weil <snip>. Also zeigst du uns nicht deinen echten Code.
    OP Ach das, das steht in dem Code den ich wirklich meine aber natürlich nicht herzeigt ja anders, also alles gut, kompiliert schon wie es soll, beantworte mal lieber meine Frage anstatt blöd Dinge zu kritisieren um die es gar nicht geht.
    🤦🏻♂



  • @hustbaer sagte in R value requires LValue:

    int& p = atoi("123");

    Ich bin in Sachen Rvalues und LValues nicht ganz so fit. Also habe ich mit dem obigen Code ein wenig rumgespielt, wobei folgendes entstand.

    #include <iostream>
    
    int main()
    {
        int&& p = atoi("123");
        int& p2 = p;
    
        p2 = 2;
        std::cout << "Hello World!\n";
    }
    

    Warum funktioniert dieser?



  • @Quiche-Lorraine Die rvalue-ref p Verlängert die Lifetime des zurückgegeben Temporaries auf die Lifetime von p.



  • Und erlaubt ist int& p2 = p; weil der Ausdruck p hier eine LValue ist, obwohl die Variable p eine RValue Referenz ist ("wenn's einen Namen hat ist es eine LValue").


Anmelden zum Antworten