从需要销毁的对象中移动
Are moved-from objects required to be destructed?
如果我从b
中移动构建a
,是否仍然有必要破坏b
,或者我可以不这样做而逃脱?
在实现optional<T>
模板期间,我想到了这个问题。摘录:
~optional()
{
if (initialized)
{
reinterpret_cast<T*>(data)->~T();
}
}
optional(optional&& o) : initialized(o.initialized)
{
if (initialized)
{
new(data) T(std::move(*o)); // move from o.data
o.initialized = false; // o.data won't be destructed anymore!
}
}
当然,我可以用一个三值枚举来替换bool值initialized
,该枚举可以区分初始化、未初始化和移出。我只是想知道这是否绝对必要
是的,仍然需要销毁b
。移动的对象是一个有效的构造对象。在某些情况下,它甚至可能包含仍然需要处理的资源。在您所展示的泛型代码中,T
甚至可能没有move构造函数。在这种情况下,您可以调用复制构造函数。因此,您绝对不能假设~T()是无操作的,可以省略。
是的,您仍然需要销毁它们。例如,可以显示此缺陷的设计之一是基于观察者的模式,其中一个对象保留指向另一个对象的指针列表。不运行析构函数不会移除指针,当代码试图访问一个不再存在的对象时,代码会崩溃。
在您的示例中,更简单的事情是在移动-from对象中不将initialized设置为false。在被移出后,值仍然被定义为处于有效状态,并且您所引用的右值的析构函数将在没有进一步干预的情况下清除它。
我想对你的问题回答"不",但我不确定这是不是一个正确的问题。考虑以下内容:
{ // start of scope
T maybe_moved;
if(some_condition) {
T(std::move(maybe_moved));
}
// end of scope
}
对于maybe_moved
对象, T::~T()
显然应该只调用一次。如果move构造函数调用它,您将如何使这些无害的代码工作?
相关文章:
- 将对象移动到std::shared_ptr
- std::使用内部对象移动 - 与调用不匹配
- 基于范围的 for 循环将对象移动到另一个容器中?
- 将列表的对象C++移动到另一个对象
- 从移出对象移动
- C++如何将对象移动到 nullptr
- Qt 通过将对象移动到线程来跨线程发出信号
- 如何将对象移动到std::async()
- 2D 阵列/网格中的对象移动
- 无法将套接字对象移动到std::vector中
- 在将对象移动到另一个线程后,不能简单地删除该对象
- 如何将相互依赖的对象移动到一起并维护内部引用
- 在OpenGL中将2D对象移动到一个点
- 如何将对象移动到未初始化的内存中
- 复制构造函数并通过跟踪对象移动语义
- SFML -将对象移动到coord
- 在堆栈程序中实现一个计数器,用于计算对象移动的次数
- Std::将Std::unique_ptr对象移动到STL容器中.(MSVC编译器问题)
- 将临时对象移动到矢量中
- 将c++对象移动到内存位置