Недавно я «поиграл» с rvalue, чтобы понять их поведение. Большинство результатов меня не удивило, но потом я увидел, что если я бросаю локальную переменную, вызывается конструктор перемещения.
До этого я думал, что цель правил семантики перемещения состоит в том, чтобы гарантировать, что объект будет перемещен (и станет недействительным) только в том случае, если компилятор сможет определить, что он больше не будет использоваться (как в случае с временными объектами), или пользователь обещает не использовать его (как в 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
}