【问题标题】:Public deleted or private default ctor/assignment/copy ctor?公开删除或私有默认ctor/assignment/copy ctor?
【发布时间】:2014-12-07 22:08:10
【问题描述】:

如果我想禁止复制构造/分配,那么是:

class foo
{
public:
   foo(const foo&) = delete;
   foo& operator = (const foo&) = delete;
};

同:

class foo
{
private:
   foo(const foo&) = default;
   foo& operator = (const foo&) = default;
};

哪种方法是正确的,为什么?

【问题讨论】:

  • 在后者foo的实例被允许复制自己
  • 朋友类/方法也是如此,他们都可以访问

标签: c++ c++11 default-constructor


【解决方案1】:

正确的方法是第一个解决方案:复制构造函数和赋值运算符没有定义,因此任何使用它们的尝试都不会编译。

class foo
{
public:
   foo(const foo&) = delete;
   foo& operator = (const foo&) = delete;
};

第二个是声明并定义隐式生成的表单为private

  • foo 类型的对象允许复制自身。
  • 任何朋友类或方法也可以复制foo

所以复制构造/分配是仍然可能的。

您也可以使用 boost::noncopyable 作为基类,它与 c++11 完全一样(参见源代码 here

【讨论】:

  • 是的,即使在 C++11 中添加了删除某些成员函数以禁用某些成员函数,我仍然更喜欢 boost::noncopyable,因为它使意图一目了然,而且打字也少得多。
猜你喜欢
  • 2019-08-07
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2019-04-24
  • 2019-11-09
  • 1970-01-01
  • 2020-09-17
  • 2017-04-08
相关资源
最近更新 更多