標準は、オブジェクトが移動された後、オブジェクトで何ができるかを正確に定義していますか?以前は、移動元のオブジェクトでできることは、オブジェクトを破棄することだけだと思っていましたが、それだけでは不十分です。
たとえばswap
、標準ライブラリで定義されている関数テンプレートを考えてみましょう。
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
明らかに、移動元のオブジェクトに割り当てることができる必要があります。そうしないと、2行目と3行目が失敗します。では、moved-fromオブジェクトで他に何ができるでしょうか?これらの詳細は、標準のどこに正確に記載されていますか?
(ちなみに、 1行T c = std::move(a);
目ではなくなぜT c(std::move(a));
ですか?)