Passing const return value



  • Hallo Experten,

    ich möchte eine Objekt-Ref. (const Nachricht<bool>&) als const aus einer Memberfunktion zurückgeben und damit dann weiterarbeiten. Irgendwas mache ich falsch.
    Hier mein Code:

    // Nachricht.cpp
    ...
    Nachricht<bool>& Sender::getNachrichtByName(std::string name)
    {
        const Nachricht<bool> cMsg;
    
        auto iter = _signalList.find(name);
            if(iter != _signalList.end()) {
                cMsg = &(iter->second); // Übergabe der Ref.
            }
            else {
                std::cout << "no signal found\n";
            }
        return cMsg;
    }
    ...
    
    // main.cpp
    ...
    const Nachricht<bool>& cSig = job.getNachrichtByName("RUNNING");//Scheint OK zu sein
    
    std::string str= cSig.getName(); // Hier dann der Fehler
    ...
    

    Fehlermeldung:
    ..\sr1\main.cpp: In function 'int main()':
    ..\sr1\main.cpp:26:35: error: passing 'const Nachricht<bool>' as 'this' argument discards qualifiers [-fpermissive]
    std::string str= cSig.getName();



  • Hallo,

    getName() scheint nicht const zu sein.

    cMsg ist übrigens eine lokale Kopie, die du da als Referenz zurück gibst.
    Glaube nicht, dass du das willst.



  • Warum muß getName() const sein? Ich habe gedacht das const bezieht sich nur auf das Objekt selbst und nicht auf deren Memberfunktionen (wie hier getName() ).

    Ich möchte die Ref. von Nachricht als const zurückgeben und damit weiterarbeiten.
    Einfach nur mal ausprobieren als Alternative zu einem Pointer.



    • Zum einen möchtest du eine reference zu einem Objekt returnen, dass beim Verlassen der Funktion out-of-scope geht, das geht aber entweder mit rvalue referenzen oder aber mit lvalue referenzen to const
    • Wieso ist dein lokales Object const deklariert?
    • return einfach bei value, Stichwort RVO (vorausgesetzt die Klasse Nachricht hat move ctor und move assigment operatoren, entweder selbst definiert oder aber die compiler generierten


  • ok - danke für die Beiträge!
    Adios



  • schnebe schrieb:

    Warum muß getName() const sein? Ich habe gedacht das const bezieht sich nur auf das Objekt selbst und nicht auf deren Memberfunktionen (wie hier getName() ).

    Aber wenn jetzt getName den Namen ändern würde (und das darf es, wenn es nicht const ist), dann ist den Objekt doch nicht const. const heißt, dass du etwas nicht ändern darfst. Somit darfst du natürlich auch keine das Objekt ändernden Funktionen aufrufen! getName() ist aber sehr wahrscheinlich ein getter - also sollte getName() als const markiert sein. Dann kannst du es auch auf dem const Objekt aufrufen. Klar soweit?

    Ich möchte die Ref. von Nachricht als const zurückgeben und damit weiterarbeiten.

    Eine Referenz auf ein lokales Objekt ist aber SOFORT bei Verlassen des Blocks ungültig. Also gibt keine Referenzen auf lokale Objekte zurück!

    Nachdem du das verinnerlicht hast, kannst du https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ lesen.


Anmelden zum Antworten