Wie sicher ist diese Methode der Emulation von Bewegungssemantik in C ++ 03?

9

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 :

%Vor%

Dann benutze ich es so:

%Vor%

Meine Frage ist, wie sicher ist dieser Ansatz in der Praxis? ( vorausgesetzt, es kompiliert fein )

  1. Gibt es irgendwelche praktischen Szenarien, in denen es in C ++ 03, nicht aber in C ++ 11 nicht richtig funktioniert?

  2. 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.)

    
Mehrdad 23.12.2013, 11:41
quelle

2 Antworten

0

Die Zusammenfassung scheint zu sein, "es ist sicher, solange Sie es auf die übliche Weise verwenden".

    
Mehrdad 04.01.2014, 06:13
quelle
3

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.

    
Yakk 23.12.2013 14:06
quelle

Tags und Links