最近、私は自分のふるまいを理解するために、評価額を「再生」しました。ほとんどの結果は私を驚かせることはありませんでしたが、私はローカル変数をスローすると、移動コンストラクタが呼び出されることがわかりました。なぜローカル変数呼び出しがコンストラクタを移動するのですか?
これまでは、移動セマンティクス規則の目的は、コンパイラが(一時オブジェクトの場合のように)それ以上使用されないことを検出できる場合にのみ、オブジェクトが移動して無効になることを保証することであると考えました。ユーザーはそれを使用しないことを約束します(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
}
もしそうなら、gccのバグのようです。 –
@kbok:あなたが正しいです、私は私の答えを削除しました(私はここにあなたのコメントに答えています)。私はどういうわけか 's'が' try'ブロックの中で宣言されていると思っていました。申し訳ありませんすべて –
http://gcc.gnu.org/bugzillaに報告してください - ありがとう! –