将构造函数标记为已删除时,即
class MyClass {
// ...
MyClass(int x) = delete;
// ...
};
将删除的构造函数标记为
explicit
有什么影响吗?即
explicit MyClass(int x) = delete;
?
是的,
= delete
不影响重载解析。 explicit
确实会影响在不同的重载解决场景中是否考虑重载。
示例:
struct MyClass {
MyClass(int x) = delete;
MyClass(long x) { };
};
如果第一个构造函数上没有
explicit
,则 MyClass x = 0;
的格式不正确,因为重载解析会更喜欢第一个构造函数。对于 explicit
,第一个构造函数不被考虑用于复制初始化,而选择第二个构造函数(否则匹配会更差)。初始化不会格式错误。
删除构造函数意味着您想要导致特定的重载解析结果,从而使构造函数格式错误。在决定要采用哪种格式错误时,您始终必须考虑是否应应用
explicit
,就像定义非删除重载时一样。