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?
Antwort
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.
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? –
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
Hmmm gut .. Aber konnte nicht das gleiche durch non-const lvalue Referenzen, wie der bewegliche Teil erreicht werden? –
- 1. Warum Batchdateien als Bedrohung angesehen werden
- 2. Warum wird SHA-1 als unsicher angesehen?
- 3. DBMS_RANDOM als gefährlich angesehen?
- 4. Thread.Yield() als schädlich angesehen?
- 5. Warum wird eine Ladenladeschranke als teuer angesehen?
- 6. Warum werden globale Variablen als schlechte Praxis angesehen?
- 7. Warum werden 0d-Arrays in Numpy nicht als skalar angesehen?
- 8. Werden Ausgabeparameter als schlechte Praxis angesehen?
- 9. Welche Funktionen werden als erweiterte Python angesehen?
- 10. Warum wird Array als besser als STL-Container angesehen?
- 11. Stil als schädlich angesehen?
- 12. Warum wird das W3C-Boxmodell als besser angesehen?
- 13. Warum wird eine interpretierte Sprache als tragbarer angesehen?
- 14. ist mt_rand() sicherer als rand()
- 15. Warum wird Javascript: void (0) als schädlich angesehen?
- 16. Warum wird Iterator in der Python-Dokumentation als funktional angesehen?
- 17. Wird mapM/sequenz als gute Praxis angesehen?
- 18. Werden SMS innerhalb der Europäischen Union als international angesehen?
- 19. Kann Garn als Ersatz für Bower und Npm angesehen werden?
- 20. "sonst" in Python als schädlich angesehen?
- 21. Ist Json_encode() sicherer als serialisieren in PHP?
- 22. Warum ist mein unsicherer Code langsamer als mein sicherer Code?
- 23. Python: Warum wird "/ hallo" als absolute Pfadkomponente angesehen, aber für die Website als relativer Pfad?
- 24. Nebenwirkungen in einem Iterator als schädlich angesehen?
- 25. Was wird in mongoDB als Dokument angesehen?
- 26. Wird dies als schlechtes RESTFul-Design angesehen?
- 27. Warum werden diese ungeordneten C + + STL-Sätze nicht als gleich angesehen?
- 28. In PHP, werden zu viele Zuweisungen als schlecht angesehen? Wenn ja warum?
- 29. Sammlung sicherer als Standardliste mit generischem Typ?
- 30. Xlwings sicherer Excel-Bereich als Python-Liste
Sprechen Sie über die Begründung für 'std :: move()'? – user0042
Genau wie eine Konstante lvalue-Referenz erweitern rvalue-Referenzen die Lebensdauer ihres Referenten. Nicht-konstante Lvalue-Referenzen weisen diese Eigenschaft nicht auf. –