首页 > 解决方案 > 为无复制/无移动类型扩展的最小类是什么?

问题描述

假设我想创建一些类来管理不应复制或移动的资源,这将是扩展和避免错误的最小类?

这个想法是,通过扩展类,我在0/3/5 规则的安全方面结束。

我有这个想法,这显然有效。

class NOCOPYNOMOVE {
    NOCOPYNOMOVE(NOCOPYNOMOVE &v) = delete;
    NOCOPYNOMOVE(NOCOPYNOMOVE &&v) = delete;
    NOCOPYNOMOVE& operator=(NOCOPYNOMOVE &r) = delete;
    NOCOPYNOMOVE& operator=(NOCOPYNOMOVE &&r) = delete;
};

class Foo: private NOCOPYNOMOVE {
public:
    Foo() {}
    ~Foo() {}
};

标签: c++rule-of-threerule-of-five

解决方案


  • 不需要删除移动构造函数,见https://stackoverflow.com/a/38820178/2945027
  • 避免ALL_CAPS使用名称,因为它通常是用于宏的每个约定
  • 没有理由const在复制构造函数/赋值中省略,所以应该首选通常的形式
  • 如果类会从某个命名空间中的某些类继承NOCOPYNOMOVE,则可能会触发意外的 ADL。boost::noncopyable通过将定义放在noncopyable_命名空间中来解决它,请参阅实现
  • 我宁愿没有一些基础,而是在目标类中拼出这两三行:
class Foo {
public:
    Foo() {}
    ~Foo() {}

    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
};

推荐阅读