重新使用移动的容器
Reusing a moved container?
重用移动容器的正确方法是什么?
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,尽管vec3可以允许一些额外的优化,但另一方面很容易导致错误。
我的假设正确吗?
§17.3.26有效但未指定的状态[定义有效]
一种未指定的对象状态,除非满足对象的不变量,并且对对象的操作行为与为其类型指定的一样
[示例:如果类型为
std::vector<int>
的对象x
处于有效但未指定的状态,则x.empty()
可以无条件调用,只有x.empty()
返回false
才能调用x.front()
。——结束示例]
因此,对象是活的。您可以执行任何不需要前置条件的操作(除非您先验证前置条件)。
例如,clear
没有任何先决条件。它将使对象返回到已知状态。所以,只要清除它并正常使用它。
对象处于有效但未指定的状态基本上意味着,虽然不能保证对象的确切状态,但它是有效的,因此,只要成员函数(或非成员函数)不依赖于具有特定状态的对象,它们就可以保证工作。
clear()
成员函数对对象的状态没有任何先决条件(当然,除了它是有效的),因此可以在从对象移动时调用。另一方面,例如front()
取决于容器不是空的,因此不能被调用,因为它不能保证是非空的。
因此,ver2和ver3都应该是好的。
我认为你不能对从中移动的对象做任何事情(除了销毁它)。
难道你不能使用swap
来获得移动的所有优势,但让容器处于已知状态吗?
相关文章:
- 使用新行和不使用新行读取文件
- 何时在引用或唯一指针上使用移动语义
- 可以使用移动语义更改或改进此C++代码吗?
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- c++在使用指针时移动语义
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何使用新运算符跟踪在循环中创建的 QLabel
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- C++使用另一个数组和新值初始化数组
- 新的整数数组向右移动?
- 定义C++新的环境变量并在 bat 文件中使用它
- 使用派生类的新放置
- 如何使用 GPS 和指南针开发点移动算法
- c++ 向量push_back移动新元素
- 移动后C++使用:有效的用例?
- 移动物体使用增量时间卡顿以统一速度
- 使用memcpy移动数组并在给定位置插入一个新元素
- 在不影响其他对象的情况下移动对象(使用opengl)
- 第一次鼠标移动意外使用SDL (c++)
- 在库中定义数组大小,而不必为每次新使用进行修改