11

sagen, dass ich die folgende FunktionWarum erstellt C++ nicht standardmäßig rValue-Referenzen?

void doWork(Widget && param) // param is an LVALUE of RRef type 
{ 
    Widget store = std::move(param); 
} 

Warum muss ich param zurück zu einem R-Wert mit std::move() werfen müssen? Sollte es nicht offensichtlich sein, dass der Typ param rvalue ist, da er in der Funktionssignatur als R-Wert-Referenz deklariert wurde? Sollte hier nicht automatisch der Move-Konstruktor nach diesem Prinzip aufgerufen werden?

Warum passiert das nicht standardmäßig?

Antwort

22

mit Ihrem Design:

void doWork(Widget && param) 
{ 
    Widget store1 = param;  // automatically move param 
    Widget store2 = param;  // boom 

    Widget store_last = param; // boom  
} 

mit aktuellem Design:

void doWork(Widget && param) 
{ 
    Widget store1 = param;    // ok, copy 
    Widget store2 = param;    // ok, copy 

    Widget store_last = std::move(param); // ok, param is moved at its last use 
} 

Der Moral ist hier, dass selbst wenn Sie einen rvalue Bezug haben Sie dafür einen Namen haben, was bedeutet, Sie verwenden können, es mehrmals. Daher können Sie es nicht automatisch verschieben, da Sie es für eine spätere Verwendung benötigen könnten.

+0

Oh, ich verstehe. Es macht Sinn! Ich stimme zu, das Kopierdesign ist immer sicherer als implizite Bewegung! – barney

+0

@ Barney diesen Moment, wenn ein einfaches Beispiel dich gehen lässt "Oh, ich verstehe. Es macht Sinn!" Freut mich, ich könnte einen zur Verfügung stellen. – bolov

+0

Ich finde es wirklich schwierig, tatsächlich einen Code zu finden, der das tut, und noch mehr kann ein Compiler nicht als Fehler erkennen und behandeln. Gab es eine Diskussion für den Vorschlag über die relativen Kompromisse, oder gibt es eine Situation, die viel wahrscheinlicher ist? –

Verwandte Themen