2016-04-09 6 views
1

Grundsätzlich, wenn ich eine Variable T value habe, und eine Funktion T func(const T &), die eine T in eine andere verwandelt, kann ich new (&value) T(func(value)) tun? Ich bin mir nicht sicher, ob das Umschreiben desselben Ortes Probleme verursachen kann. Kann die alte value überschrieben werden, bevor func(value) endet?C++ in-place Platzierung neu

UPDATE: Ich tue dies, um zu versuchen, eine Tail-Rekursion in eine Schleife zu verwandeln (Compiler können es wegen nicht-trivialem Destruktor nicht optimieren). Methoden besser als Placement neu sind mehr als willkommen!

+3

Warum nicht einfach 'value = func (value);'? – Jarod42

+0

@ Jarod42 'T' möglicherweise nicht kopieren (oder verschieben) zuweisbar. –

+0

So versuchen Sie, T-Schnittstelle zu umgehen:/... Beachten Sie auch, dass Sie vergessen, "Wert" Destruktor mit Ihrem Placement neu zu nennen. – Jarod42

Antwort

1

Nein, das geht nicht (sicher). Die Platzierung neu muss für einen zugewiesenen, aber nicht initialisierten Speicher oder für ein POD-Objekt verwendet werden.

Sie können nicht einfach Konstruktoren umgehen, kopieren, Ctors/Zuweisungen und Destruktoren auf Objekte verschieben (außer für PODs). Wenn du das willst, stimmt etwas nicht mit deinem Design und du musst zum Zeichenbrett gehen.