Verwenden Sie diese Antwort habe ich meine eigene Methode zur Emulation von Bewegungssemantik in C ++ 03 basierend auf swap
erfunden.
Zuerst erkenne ich move-semantics (d. h. Verfügbarkeit von C ++ 03):
%Vor% Dann definiere ich bedingt ein Makro namens move
:
Dann benutze ich es so:
%Vor%Meine Frage ist, wie sicher ist dieser Ansatz in der Praxis? ( vorausgesetzt, es kompiliert fein )
Gibt es irgendwelche praktischen Szenarien, in denen es in C ++ 03, nicht aber in C ++ 11 nicht richtig funktioniert?
Was ist mit dem Gegenteil - kann es in C ++ 11 korrekt funktionieren, aber in C ++ 03 fehlschlagen?
( Hinweis: Ich suche eine praktische Antwort, keine Sprachanwaltsantwort. Mir ist bewusst, dass die Definition neuer Mitglieder in namespace std
technisch undefiniert ist, aber in der Praxis hat das gewonnen Probleme bei jedem Compiler verursachen, so dass ich mich nicht für die Zwecke dieser Frage sorgen muss. Ich mache mir Sorgen über Fälle wie zufällige hängende Referenzen und dergleichen.)
move
bewegt sich nicht, aber Ihr move
tut es. Dies bedeutet, dass in C ++ 11 ein std::move
für einen Ausdruck vorhanden ist, der sie nirgends anordnet, oder der Benutzer die Daten nicht ändert. Deines tut.
Was noch schlimmer ist, ist, dass Ihr move
rvo / nrvo blockiert, genau wie C ++ 11. In C ++ 11 wäre Ihre Return-Anweisung von test
eine schlechte Idee, da der Rückgabewert implizit move
ed wäre. In C ++ 03, da nrvo bei Argumenten blockiert ist, wäre es optimal. Also ist die Verwendung der beiden unterschiedlich.
Der Rückgabewert std::move
gibt die Lebensdauerverlängerung zurück, der Rückgabewert in C ++ 11 hingegen nicht. Code muss vollständig in beiden getestet werden.
Tags und Links c++ c++11 move-semantics c++03