2017-07-07 1 views
0

Vor C++ 11 konnten nur Constance-Referenzen auf Rvalues ​​verweisen, da Rvalue-Referenzen nicht existierten und nicht-konstante Lvalue-Referenzen nicht an Rvalues ​​binden konnten. Der Grund, afaik, warum nicht-konstante Lvalue-Referenzen nicht an rvalues ​​binden konnten, war, dass es gefährlich wäre. Also haben sie rvalue-Referenzen gemacht, die es möglich gemacht haben, Daten zu verschieben ... aber warum sind rvalue-Referenzen an rvalues ​​gebunden, die als sicherer betrachtet werden als nicht-konstante lvalue-Referenzen, die an rvalues ​​gebunden sind?Warum werden Rvalue-Referenzen als sicherer angesehen als Lvalue-Referenzen?

+0

Sprechen Sie über die Begründung für 'std :: move()'? – user0042

+0

Genau wie eine Konstante lvalue-Referenz erweitern rvalue-Referenzen die Lebensdauer ihres Referenten. Nicht-konstante Lvalue-Referenzen weisen diese Eigenschaft nicht auf. –

Antwort

1

Der Vorteil von Rvalue-Referenzen gegenüber Lvalue-Referenzen besteht darin, dass Sie mit Rvalue-Referenzen wissen, dass das Objekt, auf das verwiesen wird, ein Rvalue ist. Sie wissen also, dass Sie es manipulieren dürfen, ohne andere Daten zu beschädigen.

Wenn sich nicht-konstante lvalue-Referenzen auf rvalues ​​beziehen dürfen, würden Sie nie wissen, ob das Objekt, auf das verwiesen wird, temporär war oder nicht. Betrachten wir zum Beispiel diese beiden Konstrukteure

class A { 
public: 
    A(A& src) // Copy constructor 
    { 
     // Create a copy of src, but be sure to leave src intact 
    } 

    A(A&& src) // Move constructor 
    { 
     // Create a copy of src. If necessary, you can steal some 
     // of src's resources (dynamic memory, open files). It 
     // won't miss it 
    } 
}; 

Der Leistungsvorteil Sie in der zweiten Version bekommen kann nicht in der ersten erreicht werden kann, auch wenn lvalue Referenzen durften rvalues ​​verweisen.

+0

Ahh, es ist alles wegen "Sicherheit"? Tatsächlich könnten sie einer nichtkonstanten lvalue-Referenz die gleiche Funktionalität hinzufügen wie Rvalue-Referenzen, aber sie verbieten diese Verwendung einer nichtkonstanten lvalue-Referenz, weil sie zu unsicher wäre. Wenn ja, könnten sie nicht einfach so bleiben, dass nicht-konstante lvalue-Referenzen an rvalues ​​gebunden sind und die Benutzer für die korrekte Verwendung verantwortlich sind? Dann müssten sie nicht einmal einen anderen Referenztyp (rvalue references) erstellen? –

+0

Es geht nicht darum, es richtig zu benutzen. Indem ermöglicht wird, dass r-Wert-Referenzen eine ansonsten destruktive Manipulation des Objekts, auf das Bezug genommen wird, ausführen, kann manchmal ein Leistungsvorteil erzielt werden. Ich werde meine Antwort bearbeiten, um dies zu reflektieren. – oz1cz

+0

Hmmm gut .. Aber konnte nicht das gleiche durch non-const lvalue Referenzen, wie der bewegliche Teil erreicht werden? –

Verwandte Themen