Warum ruft das den Kopierkonstruktor auf, nicht den Move-Konstruktor?

9

Ich habe eine Klasse, PlayerInputComponent :

.h:

%Vor%

.cpp:

%Vor%

und eine Klasse, PlayerMoveComponen t, die ein Mitglied PlayerInputComponent enthält und es initialisiert, indem ein std::unique_ptr als Parameter übergeben wird. Sein Konstruktor:

%Vor%

Ich habe meinen eigenen move -Konstruktor für die PlayerInputComponent -Klasse definiert, da ich weiß, dass ein Standard-Move-Konstruktor nicht für eine Klasse erstellt wird, die ein Referenzelement enthält. In diesem Fall weiß ich jedoch, dass die Referenz für die Dauer der Lebensdauer des Objekts PlayerInputComponent im Gültigkeitsbereich bleibt.

Da ich die Variable PlayerMoveComponent inputComponent von einem temporären initialisiere, glaube ich, dass eines der folgenden zwei Dinge passieren soll:

  1. Der Bewegungskonstruktor PlayerInputComponent wird verwendet, um die playerInputComponent -Membervariable zu initialisieren.
  2. Die Verschiebung wird vom Compiler aufgehoben.

Visual Studio 2012 spuckt dies jedoch aus:

%Vor%

Warum wird der Kopierkonstruktor hier aufgerufen? Wenn die PlayerInputComponent -Klasse% parentMoveComponent -Member eine normale ParentMoveComponent -Instanz statt einer Referenz wird, wird der Fehler beseitigt, aber ich verstehe nicht warum - Ich habe getestet und verifiziert, dass die Konstruktion von Objekten mit Referenzelementen funktioniert Solange Sie Ihren eigenen Move-Konstruktor zur Verfügung stellen, was ist der Deal?

    
Benjamin Good 30.04.2013, 23:35
quelle

2 Antworten

1

Es tut mir leid im Voraus, wenn das Ihre Frage nicht wirklich beantwortet, ich möchte nur auf die offensichtliche Komplexität Ihres Problems reagieren. Wenn ich könnte, wäre das nicht tausendmal einfacher:

%Vor%

und doch dasselbe erreichen? Ich habe nichts gegen die Verwendung der neuen Funktionen in C ++ 11, wie std::unique_ptr , aber IMHO, um sicherzustellen, dass ein Zeiger nie aus zwei Orten dereferenziert werden kann, sollte nicht eine Frage der Laufzeitprüfung sein (außer vielleicht in sehr seltenen Fällen) ), aber eine Frage des Designs .. sollte es nicht?

    
Sheljohn 07.05.2013 09:47
quelle
1

Wenn Sie ein neues Objekt mit = initialisieren, wird der Kopierkonstruktor standardmäßig ausgelöst. Um den Move-Konstruktor auszulösen, müssen Sie das Verhalten von operator= ändern. Hier finden Sie ein Beispiel hier Ich hoffe, ich habe dir geholfen.

    
Kostas Andrianos 15.04.2017 12:55
quelle

Tags und Links