Недавно я "играл" с rvalues, чтобы понять их поведение. Большинство результатов меня не удивили, но потом я увидел, что, если я выложу локальную переменную, вызывается конструктор перемещения.
До тех пор я думал, что целью правил семантики перемещения является гарантировать, что объект будет перемещаться (и становится недействительным) только в том случае, если компилятор может обнаружить, что он больше не будет использоваться (как в временных объектах), или пользователь обещает не использовать его (как в std:: move).
Однако в следующем коде не выполняется ни одно из этих условий, и моя переменная все еще перемещается (по крайней мере, на g++ 4.7.3).
Почему это?
#include <iostream>
#include <string>
using namespace std;
int main() {
string s="blabla";
try {
throw s;
}
catch(...) {
cout<<"Exception!\n";
}
cout<<s; //prints nothing
}