为可移动物体存储“有效性”状态是一种好习惯吗?

时间:2014-03-24 08:38:59

标签: c++

我正在设计一个库,许多类都是可移动的。许多可移动类作为参数传递给其他类的函数。我在考虑如何最小化验证检查的代码。在构造之后,可移动类的实例总是处于有效状态,但是在移动之后它们变为无效。

拥有一面有效的旗帜是不错的做法?在构造之后这是真的并且在移动之后变为假。对象再次有效的唯一方法是将有效对象移入其中。

我还要提到移动对象后不要进入调用它们的函数会导致未定义的行为或任何东西的状态。移动后的内容就是垃圾。

1 个答案:

答案 0 :(得分:8)

我应该或者我应该

这样的标记可能适合于调试目的,但通常由使用库/代码的开发人员来确保他/她从不使用您的对象在使用它们之后,这种方式很古怪。

move-constructors move-assignments 的目的是将数据从src移动到dst,这有效地使{ {1}}只包含垃圾,使用此类功能的开发人员应该知道这一点。

注意:永远不应该形成错误的结构包括赋值运算符,应始终能够将新数据分配给移动 object。


由于移动来自通过变量访问的对象(即 lvalue ),只有在开发人员明确说明 1)时才会发生开发人员使用此类代码签署了一份无形合同,该合同使他/她对移动后使用该对象的任何副作用负责。

注意: 1)通过srcstd::move (val)或同等文件。



标准图书馆

如果我们查看标准库,我们会发现实际上没有static_cast<T&&> (val)标志,而是(如上所述)直到开发人员以确保他没有使用无效的结构移动物体。