2012-04-03 5 views
9

Beispielcode:Semantik und primitive Typen bewegen

int main() 
{ 
    std::vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
    std::cout << "Printing v1" << std::endl; 
    print(v1); 
    std::vector<int> v2(std::make_move_iterator(v1.begin()), 
         std::make_move_iterator(v1.end())); 
    std::cout << "Printing v1" << std::endl; 
    print(v1); 
    std::cout << "Printing v2" << std::endl; 
    print(v2); 

    std::vector<std::string> v3{"some", "stuff", "to", 
         "put", "in", "the", "strings"}; 
    std::cout << "Printing v3" << std::endl; 
    print(v3); 
    std::vector<std::string> v4(std::make_move_iterator(v3.begin()), 
           std::make_move_iterator(v3.end())); 
    std::cout << "Printing v3" << std::endl; 
    print(v3); 
    std::cout << "Printing v4" << std::endl; 
    print(v4); 
} 

Ausgang:

Printing v1 
1 2 3 4 5 6 7 8 9 10 
Printing v1 
1 2 3 4 5 6 7 8 9 10 
Printing v2 
1 2 3 4 5 6 7 8 9 10 
Printing v3 
some stuff to put in the strings 
Printing v3 

Printing v4 
some stuff to put in the strings 

Fragen

  1. Seit Verschiebeoperationen o n primitive types ist nur eine Kopie, kann ich davon ausgehen, dass v1 unverändert gelassen wird oder ist der Zustand auch bei primitiven Typen nicht spezifiziert?

  2. Ich nehme an, der Grund, warum primitive Typen keine Bewegungssemantik haben, ist, weil das Kopieren genauso schnell oder sogar schneller ist, ist das korrekt?

Antwort

14
  1. Nein, wenn Sie diese in der Lage sein wollen annehmen, dass Sie kopieren sollten, sich nicht bewegen.

  2. Eine Bewegung verlässt das Quellobjekt in einem gültigen, aber nicht angegebenen Status. Primitive Typen do zeigen Bewegungssemantik. Die Tatsache, dass das Quellobjekt unverändert bleibt, legt nahe, dass das Kopieren der schnellste Weg ist, das Verschieben zu implementieren.

+1

Die Regel "Gültiger, aber nicht angegebener Status" gilt nur für Standardbibliothekstypen ([lib.types.movefrom]). "Bewegliche" Grundtypen werden von den Kernsprachenregeln gesteuert, und für solche Typen ist eine Bewegung eine Kopie. –