最近,我“玩弄”了rvalue,以了解它们的行为。大多数结果并没有让我感到惊讶,但后来我发现,如果我抛出一个局部变量,就会调用move构造函数。
在此之前,我认为移动语义规则的目的是保证只有当编译器检测到不再使用该对象(如在临时对象中),或者用户承诺不再使用它(如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
}
发布于 2013-06-05 19:50:11
在给定的情况下,这可能是一个编译器错误,因为抛出(和移出)的变量随后会被引用。
在一般情况下,在throw
上调用move在概念上与在return
上调用move是相同的。当已知变量不能在给定点(throw
或return
)之后被引用时,最好自动调用move。
https://stackoverflow.com/questions/16938951
复制相似问题