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
type 是允许派生类实现other构造函数,例如C::C(int)
(或者甚至是用户提供的C::C()
).
现场观看 https://wandbox.org/permlink/VVk0EPXI0zu7Gq88.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)