重新使用移动的容器?
什么是重用移动的容器的正确方法?
std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2);
从我在C ++ 0x标准草案中读到的内容; ver3似乎是正确的方法,因为移动后的对象在
“除非另有规定,否则此类移动物体应置于有效但未指明的状态。”
我从来没有发现任何情况下,“否则指定”。
虽然我发现ver3有点迂回,会有很多首选的ver1,尽pipevec3可以允许一些额外的优化,但另一方面可能容易导致错误。
我的假设是否正确?
规范“有效但未明确的状态”的第17.3.26节:
除了满足对象的不variables以及对象的操作按照其types指定的行为之外,没有指定对象状态[示例:如果
std::vector<int>
types的对象x
处于有效但未指定的状态,则x.empty()
可以无条件地调用x.front()
只有在x.empty()
返回false时才能调用x.empty()
。 – 例子]
因此,对象是活的。 您可以执行任何不需要先决条件的操作(除非先validation前提条件)。
clear
,例如,没有任何先决条件。 它会将对象返回到已知的状态。 所以只要清除它,并正常使用它。
对象以一个有效但未定义的状态为基本意味着虽然对象的确切状态不能得到保证,但是它是有效的,并且这样的成员函数(或者非成员函数)只要不依赖于对象具有一定的状态。
clear()
成员函数对对象的状态没有任何先决条件clear()
除此之外它当然是有效的),因此可以从对象中移出。 另一方面,例如front()
取决于容器不是空的,因此不能被调用,因为它不能保证是非空的。
因此,ver2和ver3都应该罚款。
我不认为你可以做任何与移动的对象(除了销毁它)。
你不能使用swap
,以获得移动的所有优势,但离开容器在一个已知的状态?