gcc コンパイラがローカル変数 (一時的ではない) を右辺値引数として関数に移動するという問題が発生しました。簡単な例があります:
class A
{
public:
A() {}
A& operator=(const A&) { std::cout << "const A&\n"; return *this; }
A& operator=(A&&) { std::cout << "A&&\n"; return *this; }
};
class B
{
public:
B() {}
B& operator=(const B&) { std::cout << "const B&\n"; return *this; }
B& operator=(B&&) { std::cout << "B&&\n"; return *this; }
template<class T> B& operator=(const T&) { std::cout << "const T& (T is " << typeid(T).name() << ")\n"; return *this; }
template<class T> B& operator=(T&&) { std::cout << "T&& (T is " << typeid(T).name() << ")\n"; return *this; }
};
int main(int argc, char **argv)
{
A a1;
A a2;
a1 = a2;
B b1;
B b2;
std::cout << "B is " << typeid(B).name() << "\n";
b1 = b2;
}
出力:
const A&
B is 1B
T&& (T is 1B)
ムーブ割り当ては右辺値をゼロにするので、私はそれを期待していませんでした。私の場合、b2 が b1=b2; の後に使用されたため、クラッシュが発生しました。
問題は、なぜそれが起こったのかです。