了解零规则

Understanding rule of zero

我有一个基 class,我不想使派生 class 可复制。为了使一切明确,我以这种方式实现它:

class A {                                                                     
public:    
    A() = default;                                                                   
    virtual ~A() = default;                                                   
    A(const A&)  = delete;                                                    
    A(const A&&) = delete;                                                    
    A& operator=(const A&)  = delete;                                         
    A& operator=(const A&&) = delete;                                         

    virtual void vFun() = 0;                                                  
};                                                                            

class B : public A {                                                          
public:
    B() = default;                                                                       
    virtual ~B() = default;                                                   
    B(const B&)  = delete;                                                    
    B(const B&&) = delete;                                                    
    B& operator=(const B&)  = delete;                                         
    B& operator=(const B&&) = delete;                                         

    virtual void vFun() override {}                                           
};

这是做这些事情的正确方法吗?根据我的知识和阅读的内容,答案是肯定的,但我想在将其引入生产系统之前确定一下。


编辑

总结一下: 1) 几乎总是移动操作符不应该被删除。那是因为"there's an infinity of things that require movability"。 2) 对于抽象基 class,允许编译器生成特殊成员函数,如果有必要,将删除移至派生 class 更安全。

不,这是完全错误的。

首先,在您使派生的 class 不可复制的过程中,您已将其设为不可可移动,这使得它几乎毫无用处。

其次,A 根本没有理由不可复制。每个派生的 class 都可以根据需要使自己不可复制。 A 已经是抽象的,不能被切片,所以没有理由使 A 不可复制。