[C++0x] Move Ctor und Move Operator automatisch erzeugt?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4887
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

[C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von Schrompf »

Hallo Leute,

ich habe gerade eine kleine Helferklasse geschrieben, die grob so aussieht:

Code: Alles auswählen

class MeinBeispiel
{
  std::vector<Xy> m1;
  std::vector<Xy> m2;
};
Ich kann diese Klasse jetzt einfach per Value rumreichen oder so aus dem Scope gehen lassen, weil der Compiler für mich ja Kopierkonstruktor, Zuweisungsoperator und Destruktor automatisch erstellt. Aber erstellt er für mich auch den Move Constructor und den Move Operator? Eigentlich müsste der ja auch so funktionieren wie die bisherigen automatisch generierten Funktionen: einfach elementweise übertragen.

Nebenbei: Wir brauchen mal eine angenehme deutsche Bezeichnung für die Move Semantics.

Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von Aramis »

Sie duerften automatisch generiert werden. Du kannst den Compiler aber auch mit einem MeinBeispiel(MeinBeispiel&&)=default (und dito fuer den Zuweisungsoperator) explizit darauf hinweisen - das waere dann aber wohl eher eine Erinnerung an dich, denn soweit ich weiss *muss* der Compiler die beiden Verschieber auch so generieren (wobei ich keine Ahnung habe, inwieweit VC den Standard aktuell umsetzt).

Gruss, Alex
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von CodingCat »

Nach dem aktuellen Draft sollten sie automatisch generiert werden. Das Microsoft-VC++-Team hat jedoch bereits bekannt gegeben, dass VC++ dies erst mit der Annahme des neuen Standards implementieren wird. In VS 2010 wirst du deshalb definitiv immer selbst Hand anlegen müssen.

Dieses Feature ist bis heute heftig umstritten, weil immer wieder Fälle gefunden werden, in denen implizite Move-Konstruktoren und -Operatoren alten Code zerstören. Dennoch sieht der aktuelle Entwurf folgendes vor:
§12.8.10 hat geschrieben:If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared
as defaulted if and only if
— X does not have a user-declared copy constructor,
— X does not have a user-declared copy assignment operator,
— X does not have a user-declared move assignment operator,
— X does not have a user-declared destructor, and
— the move constructor would not be implicitly defined as deleted.
[ Note: When the move constructor is not implicitly declared or explicitly supplied, expressions that otherwise
would have invoked the move constructor may instead invoke a copy constructor. —end note ]
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von Krishty »

OMG

Die sind jetzt wirklich implizit?! D.h., die wiederholen jetzt genau die Handlung, die mich einmal im Monat implizit erzeugte Kopierk’toren verfluchen lässt?!

Un-glaub-lich. Warum tut man sowas? Faulheit? Weil die eine Zeile mit = default noch zu viel Text ist?! Weil es gut ist, sich viel vom Compiler abnehmen zu lassen, selbst, wenn der garnicht wissen kann, wie er es richtig tun soll?

Bild
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 4887
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von Schrompf »

Ich find's gut. Bzw. fände es gut, wenn Visual Studio 10 das implementieren würde. Nuja, muss man halt dran denken.

Nach meinem Wissen wird auch die "= default" oder "= delete" Notation noch nicht von VC10 unterstützt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von dot »

Impliziter Move-Ctor und -Assignment-Op sind afaik wieder aus dem Standard rausgenommen worden nachdem sich gezeigt hat dass es damit zu extremen Problemen mit vorhandenem Code kommt.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von Krishty »

Okay, also ich habe mal ein wenig nachgeforscht und nach dem, was ich so gefunden habe, ist der Stand von November 2010, dass sich auf N3203 geeinigt wurde.

Das sagt u.a.: Hat eine Klasse einen user-defined D’tor oder Zuweisungsoperator, wird ein automatischer Kopierk’tor zwar noch erzeugt, ist aber deprecated (d.h., wird in einem der nächsten Standards rausfliegen). Umgekehrt gilt das auch für den automatischen Kopierzuweisungsoperator, falls ein user-defined Kopierk’tor deklariert wurde.

Verschiebek’toren werden zwar noch implizit erzeugt, allerdings nur, wenn
  • die Klasse keinen user-defined Kopierk’tor hat;
  • die Klasse keinen user-defined Kopierzuweisungsoperator hat;
  • die Klasse keinen user-defined Verschiebezuweisungsoperator hat;
  • die Klasse keinen user-defined D’tor hat; und
  • er nicht als = delete erzeugt würde, was auch immer das heißen mag (ich schätze für den Fall, dass ein Attribut oder eine Superklasse keinen anbietet und er deshalb nicht erzeugt werden kann).
Damit fliegt fast alles raus, was nicht POD ist. Dasselbe gilt für den Move Assignment Operator. Damit wird bestmöglich vermieden, dass der automatische K’tor / Operator Invarianten verletzt indem er was anderes tut als das, was der Programmierer bspw. per Kopierk’tor und D’tor für gewöhnliche Kopien vorgibt.

Falls das tatsächlich der endgültige Stand ist bedeutet das, dass C++0x nicht nur nicht den Fehler mit den automatischen Kopierk’toren wiederholt, sondern ihn sogar noch nachträglich korrigiert indem diese deprecated markiert werden. In diesem Fall wäre ich erleichtert.

Falls hingegen jemand was noch Aktuelleres findert, bitte her damit.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von CodingCat »

Mein Zitat oben stammt aus dem Draft Feb 2011, wie zu sehen ist, ist der Text mit deiner Übersetzung identisch geblieben.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von Krishty »

Bin ich heute blind oder habe was am Kurzzeitgedächtnis oder so? Ich hatte es echt nicht gelesen. ’Tschuldigung.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++0x] Move Ctor und Move Operator automatisch erzeugt?

Beitrag von CodingCat »

Krishty hat geschrieben:Bin ich heute blind oder habe was am Kurzzeitgedächtnis oder so? Ich hatte es echt nicht gelesen. ’Tschuldigung.
So war das aber gar nicht gemeint, sondern mehr als Antwort auf das: ;-)
Krishty hat geschrieben: Falls hingegen jemand was noch Aktuelleres findert, bitte her damit.
Den aktuellsten Draft April 2011 hingegen gibts laut Wikipedia leider (noch?) nicht öffentlich. N3242 (Feb11) ist somit der aktuellste einsehbare.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten