最近,我“玩”了右值来了解它们的行为。大多数结果并没有让我感到惊讶,但后来我看到如果我抛出一个局部变量,就会调用移动构造函数。
在那之前,我认为移动语义规则的目的是保证只有当编译器可以检测到它不再被使用(如在临时对象中),或者用户承诺不使用时,对象才会移动(并变得无效)使用它(如在 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
}