理解零规则

Understanding rule of zero

本文关键字:规则      更新时间:2023-10-16

我有一个基类,我不想让派生类可复制。为了使一切都显式,我这样实现它:

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)几乎总是移动的操作符不应该被删除。这是因为"有无限多的东西需要可移动性"。2)对于抽象基类,允许编译器生成特殊的成员函数是更安全的,如果有必要的话,将删除移到派生类中。

不,这是完全错误的。

首先,为了使派生类不可复制,您将其设置为不可可移动,这使得它几乎毫无用处。

其次,A没有理由是不可复制的。每个派生类只要愿意就可以使自己不可复制。A已经是抽象的,不能切片,所以没有理由让A不可复制。