Vor kurzem habe ich mit rvalues "gespielt", um ihr Verhalten zu verstehen. Das meiste Ergebnis überraschte mich nicht, aber dann sah ich, dass, wenn ich eine lokale Variable werfe, der Move-Konstruktor aufgerufen wird.Warum werfen lokale Variablen ruft Moves Konstruktor?
Bis dahin dachte ich, dass der Zweck der Bewegungssemantikregeln darin besteht, zu garantieren, dass sich das Objekt nur dann bewegt (und ungültig wird), wenn der Compiler erkennt, dass es nicht mehr benutzt wird (wie in temporären Objekten) das Versprechen des Benutzers, es nicht zu benutzen (wie in std :: move).
Im folgenden Code wurde jedoch keine Bedingung beibehalten, und meine Variable wird immer noch verschoben (zumindest bei g ++ 4.7.3).
Warum ist das?
#include <iostream>
#include <string>
using namespace std;
int main() {
string s="blabla";
try {
throw s;
}
catch(...) {
cout<<"Exception!\n";
}
cout<<s; //prints nothing
}
wenn ja, sieht aus wie Fehler in gcc. –
@kbok: Du hast Recht, ich habe meine Antwort gelöscht (also beantworte ich hier deinen Kommentar).Ich dachte irgendwie, 's' wäre im' try'-Block deklariert, hätte die Frage genauer lesen sollen. Sorry all –
Bitte melden Sie es an http://gcc.gnu.org/bugzilla - danke! –