Move-Semantics in Parameter-Liste



  • Hi,

    ich habe eine Frage bzgl. Move-Semantics ich habe bis jetzt nicht das Gefühl, dass ich bei der Thematik wirklich mit beiden Beinen auf dem Boden stehe.

    Bis jetzt habe ich Parameter an Konstruktoren meistens als const reference übergeben und diese dann per Init-Liste kopiert, wenn die Variable die ich übergeben will nicht mehr existiert.

    Siehe:

    #include <string>
    using namespace std;
    
    class Test{
    public:
    Test(const string & value) : key_(value)  {}
    
    private:
    string key_;
    
    };
    int main()
    {
    string alpha = "alpha";
    
    Test foo(alpha);
    return 0;
    }
    

    Mit der neuen Move-Semantik wollte ich das jetzt verändern und bin mir aber unschlüssig ob ich das korrekt anwende.

    Hier mein Code:

    class Test{
    public:
    Test(string && value) : key_(value) {}
    
    private:
    string key_;
    
    };
    int main()
    {
    string alpha = "alpha";
    
    Test foo(std::move(alpha));
    return 0;
    }
    

    Ist dieser Abschnitt richtig oder muss ich nochmal in der Initialisierungsliste mit std::move auf rvalue casten?

    Also:

    Test(string && value) : key_(std::move(value)) {}
    

  • Mod

    Du willst doch sowohl lvalues als auch rvalues nehmen koennen?
    Dann schreib'

    Test(string value) : key_(std::move(value))  {}
    

    Ist dieser Abschnitt richtig oder muss ich nochmal in der Initialisierungsliste mit std::move auf rvalue casten?

    Ja, du muesstest noch einmal auf ein rvalue casten. Der Name einer rvalue Referenz ist ein lvalue. (Generell ist jeder Name ein lvalue)



  • Du brauchst nocheinmal move, da der Parameter einen Namen hat und deswegen und ein LValue ist.
    Außerdem funktioniert deine Variante nicht mehr mit LValues, dafür brauchst du beide. Um das zu sparen, kannst du auch by-Value übergeben und den Parameter dann moven.


  • Mod

    chp++ schrieb:

    muss ich nochmal in der Initialisierungsliste mit std::move auf rvalue casten?

    Also:

    Test(string && value) : key_(std::move(value)) {}
    

    ja



  • Ok, danke.

    Ich wollte eigentlich nur lvalues zulassen damit ich nicht ausversehen ein std::move beim Konstruktor aufruf vergesse.


Log in to reply