2011-01-15 12 views
0

Ich habe eine Klasse (vereinfachte):C++ Zuweisungsquelle zugeordneten Wert löscht

class a { 
    private: 
    std::vector<a> arguments; 
    public: 
    std::vector<a> getargs() { return arguments; } 
}; 

Angenommen, hat die Klasse ein Funktionselement:

void a::bubble() { 
    arguments = arguments[0].getargs(); 
} 

Ist die reine (in, dass die Quelle die Daten, Argumente [0], werden als Ergebnis des Befehls gelöscht)?

Es funktioniert auf meinem Compiler, aber ich wollte nur überprüfen, ob der C++ - Standard die Sicherheit dieser Operation garantiert.

+0

Sie können die Rückgabe als Referenz betrachten. –

Antwort

1

Ja, es ist in Ordnung. Die Funktion getargs() wird vor der Zuweisung ausgeführt. Es erstellt ein temporäres, das für die gesamte Lebensdauer der Anweisung besteht (alles zu;). Dieses Temporary wird im Aufruf des Zuweisungsoperators für std :: vector verwendet (funktioniert aber auch für unformatierte Typen). Alles ist koscher und wird gut funktionieren.

+0

Danke. Was passiert, wenn Sie ein wirklich großes Objekt kopieren? Sprich, eine, die zweimal passen kann (einmal für das Original, einmal für die Kopie), aber nicht dreimal? Oder ist die Kopie einfach mit dem Temporären verknüpft? Prost. – wyatt

+0

Nun, Sie wissen, was sie sagen ... "Größe spielt keine Rolle." Ich vermutete, dass ein Limit innerhalb von 'operator =' ein Problem verursachen könnte, wenn wir nicht über std :: vector, sondern über etwas Drittes reden würden. Was den Ausdruck selbst betrifft, spielt es keine Rolle. –

0

Warum wäre es nicht legal? Natürlich wirst du dafür immer noch in die Hölle des Programmierers gehen, aber andererseits ist es nicht wirklich du, es ist C++.

0

Ich habe keine Ahnung, was Sie tun möchten, aber es sollte gut funktionieren. Das einzige Problem ist, dass Sie sicherstellen müssen, dass Sie mindestens ein Element in Argumenten haben.

+0

Aus Neugier, es ist ein Parser für eine Lisp-ähnliche Sprache. Wenn ein bestimmter Anruf die Nummer eins hat, ersetzt er einfach den Anruf durch sein Argument. Keine Bewertung, wie beim Lispeln, also ist es nur eine Frage der Redezeit. – wyatt

Verwandte Themen