如何删除C++中类的所有隐式(默认)方法?

C++编译器在一定条件下为类添加了隐式默认构造函数、复制构造函数、析构函数、转换运算符、赋值运算符等以及其他隐式方法。

如何以最短的方式禁用/删除所有可能的隐式方法?

我不希望我的类不可复制,我只想禁用这些默认方法,以便编译器抛出编译错误,然后我自己实现它们。我只是想过度控制,这样编译器就不会对我的班级做任何无声的工作。

例如我可以做下一件事情(这只是一个虚拟示例,在现实生活中我可以有任何复杂的类):

class C {
private:
    C() = delete;
    C(C const & other) = delete;
    C & operator = (C const & other) = delete;
};

但这是很长的路要走,我也可以忘记删除一些方法签名,我需要删除所有方法。以便我自己从头开始重新实现所有方法。

而且我需要查看其他代码需要/使用且我尚未实现的所有方法的错误,而不是编译器为我默默地实现这些方法。

此外,如果我像上面的示例那样删除默认方法,我如何确定没有其他静默创建的方法?在线是否有 100% 由编译器静默创建的所有标准方法的列表?

回答

您可以采用 mixin 方法。一次定义繁琐的类

class DeleteAllSpecialMemebers {
private:
    DeleteAllSpecialMemebers() = delete;
    DeleteAllSpecialMemebers(DeleteAllSpecialMemebers const &) = delete;
    DeleteAllSpecialMemebers & operator = (DeleteAllSpecialMemebers const &) = delete;
    DeleteAllSpecialMemebers(DeleteAllSpecialMemebers &&) = delete;
    DeleteAllSpecialMemebers & operator = (DeleteAllSpecialMemebers &&) = delete;
protected:
    struct token { explicit token() = default; };
    DeleteAllSpecialMemebers(token) {}
};

然后继承它:

class C : private DeleteAllSpecialMemebers{
public:
    C(int) : DeleteAllSpecialMemebers(token{}) {}
};

额外的token类型是允许派生类实现其他构造函数,例如C::C(int)(甚至是用户提供的C::C())。

现场观看。

  • @Caleth the "joke" was that there is no largest prime, for some reason I only get complaints about the value 😉

以上是如何删除C++中类的所有隐式(默认)方法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>