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:
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:
PlayerInputComponent
wird verwendet, um die playerInputComponent
-Membervariable zu initialisieren. 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?
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?
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.
Tags und Links c++ c++11 move-semantics