存储可移动物体的"有效性"状态是否是一种好的做法?
Would it be a good practice to store a 'validness' state for movable objects?
我正在设计一个库,其中许多类是可移动的。许多可移动类作为参数传递给其他类的函数。我正在考虑如何减少验证检查的代码。可移动类的实例在构造后总是处于有效状态,但是在从。
这将是一个很好的做法,有一个标志"有效",是真的构造后,成为假后移动。对象再次有效的唯一方法是将一个有效的对象移到其中。
我还会提到,在移动对象之后,不要进入对它们调用函数会导致未定义行为或任何事情的状态。只是移动后的内容是垃圾。
我应该,还是不应该?
这样的标志可能适合调试目的,但通常由使用库/代码的开发人员来确保他/她在使用了
之后不会以一种奇怪的方式使用您的对象。 移动构造函数和移动赋值的全部目的是将数据从src
移动到dst
,这有效地使src
除了垃圾什么都没有,使用这种功能的开发人员应该意识到这一点。
注意:结构永远不应该是病态的,包括赋值操作符,应该总是能够将新数据赋值给从对象移出的。
由于将从通过变量访问的对象中移动(例如:lvalue)只有在开发人员明确地这样说的情况下才会发生 1)开发人员与这样的代码签署了一个不可见的合同,使他/她对对象被移动后使用的任何副作用负责。
<一口>注意: 1)通过std::move (val)
static_cast<T&&> (val)
或等价的。一口>
标准库
如果我们查看标准库,我们会发现在实践中没有valid
标志,相反,它(如上所述)取决于开发人员,以确保他不会在移动的对象上使用无效的结构。
相关文章:
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- C++ Chrono 确定一天是否是周末?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 派生类是单例是否是一种好的做法
- 即使在多任务处理时,添加用户时间 + 系统时间(来自 shell 的时间命令)是否是一种可靠的措施?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 为许多类可能需要的所有常量变量制作独立的头文件是否是一种很好的做法?
- 移动 l 值参考参数是否是一种不好的做法?
- LIBZIP 是否提供了一种检查zip_file是否是目录的方法?
- 在C++编程中继续下一行的另一种方法是什么?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 检查一种类型是包括通用lambda的函子
- std::conditional 的可变模板化使用,其中一种类型是实例化失败
- 除以2的另一种方法是什么?
- 哪一种方法是更快的向量(插入后排序)或集合
- 在c++中有没有更快的方法来检验一个数是否是2的整数次幂?