使用交换与对象自杀

时间:2016-05-10 10:42:59

标签: c++ boost

我正在查看Boost.Any source codevoid clear()的实现如下所示:

void clear() BOOST_NOEXCEPT
{
   any().swap(*this);
}

它基本上创建了一个临时数据并用临时数据交换数据,然后临时数将在它的析构函数中删除。我会简单地写一下:

void clear() BOOST_NOEXCEPT
{
  delete content;
  content = 0;
}

除了方法swap是简单的单行之外,这种方法还有其他优点吗?

2 个答案:

答案 0 :(得分:3)

您的版本之所以有效,是因为它完成了析构函数的工作 - delete content - 然后是默认构造函数的工作 - content = 0。通过检查any.hpp中的代码,我只能相当确定您的实现是否正确。

Boost版本执行相同的工作,而不重复构造函数和析构函数的代码。如果实施改变,它将继续工作。我也可以相当肯定,如果没有查看其他来源,它是正确的。

答案 1 :(得分:2)

这是关于模块化,而不是重复自己。

您的版本在多个位置有效地运行析构函数和构造函数逻辑。原始代码通过swap(无论如何需要定义)将权力转移到析构函数和构造函数本身,这样您就不需要将它保存在两个位置。

功能结果是一样的。