den folgenden Ausschnitt Betrachten:Wird ein Wert in diesem Fall bewegt wird
class Bar {...};
class Foo {
public:
Foo(const Bar& bar): bar_(bar) {}
private:
Bar bar_;
};
int main() {
Foo foo({...}); // Passing an rvalue Bar object here.
}
Frage: wird das Objekt, das ich in den Foo Konstruktor kopiert werden generiert haben, oder wird es verschoben werden? Genauer gesagt, welche der folgenden Aussagen trifft zu?
- Es wird immer kopiert.
- Es wird immer bewegt (ich bin mir ziemlich sicher, dass es nicht der Fall ist).
- Dies ist ein nicht spezifiziertes Verhalten.
Das ist, was ich erwartet habe. Aber ist das nicht eine der Situationen, in denen es sicher ist, den Umzug anstelle der Kopie zu machen? Ich hoffte irgendwie, dass moderne Compiler diese Optimierung für mich tun könnten, was mir erlaubte, eine (besser lesbare) Referenzform zu behalten und nicht die Leistung zu opfern. Aber das würde natürlich dieses unspezifische Verhalten ausmachen. Du sagst also, dass das im Standard behoben ist und kopiere niemals durch Verschieben hier ersetzt werden kann, oder? –
@SolenodonParadoxus - Es ist nicht sicherer. Der Umzug erfolgt lokal, im C'tor. Aber das Argument muss nicht an einen 'rvalue' gebunden sein (das Objekt befindet sich außerhalb der Funktion). Denk an eine separate Zusammenstellung. Du verbindest ein Objekt mit dir c'tor (das geht davon aus, dass es nur rvalues speist). Und dann tu das: 'Bar b; Foo f (b); '. Es ist legal C++. Du kannst es nicht ungesetzlich machen. – StoryTeller
@SolenodonParadoxus - Und ja, eine Kopie ist eine Kopie. Wenn wir einen Zug wollen, müssen wir einen Zug buchstabieren. – StoryTeller