示例代码:
#include <iostream>
int main()
{
std::vector<int> w(20, 123), x;
w = std::move(w);
std::cout << w.size() << std::endl;
}
在g++ 4.8.3上的输出为:0
当然,标准规定移动赋值运算符将操作数留在未指定状态。例如,如果代码是x = std::move(w);
,那么我们希望w.size()
为零。
然而,是否有一个指定的排序或其他条款涵盖了自我移动案例?这是不确定的,大小是0
还是20
,或者其他什么,或者是未定义的行为?标准容器在这里有任何定义的语义吗?
相关:此线程讨论了您是否应该关心自我移动在自己的类中,但没有讨论标准容器的移动赋值运算符是否如此,并且没有提供标准引用。
NB. 这是否与w = static_cast< std::vector<int> && >(w);
完全相同,或者std::move
是一个函数是否会有所不同?
a
是容器类型的值且rv
是容器类型的非const右值时,a = rv;
的操作语义为“a
的所有现有元素都将被移动分配或销毁”,后置条件为“此赋值之前,a
应等于rv
的值”。在自我移动赋值的情况下,很难同时满足这两个条件。 - T.C.