如何删除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 😉