規格は、オブジェクトが移動された後でオブジェクトに対して何ができるかを正確に定義していますか?移動元オブジェクトでできることはそれを破壊することだけだと思っていましたが、それだけでは不十分です。
たとえば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行目が失敗します。では、移動元オブジェクトで他に何ができるでしょうか?これらの詳細を規格のどこに正確に見つけることができますか?
(ちなみに、なぜ1行目ではT c = std::move(a);
なくなのT c(std::move(a));
ですか?)
pop_back
移動したくないでしょうvector
。しかし、それが正しいかどうかは確かにわかりますempty()
。