在下面的示例中,由于抽象方法
run
,我的类是抽象的。我还有一个来自另一种类型的构造函数。我总是将只有 1 个参数的构造函数标记为 explicit
,除非我希望隐式强制转换可用。但是,在抽象类的特殊情况下,有什么理由证明它是合理的吗?
class Foo
{
public:
virtual void run() = 0; // Then the class is abstract
explicit Foo(Bar const& bar);
};
注意:我的问题纯粹是技术性的:有没有办法在抽象类的构造函数上使用或不使用显式关键字来实现不同的行为?
但是,在抽象类的特殊情况下,有什么理由证明它是合理的吗?
如果您使用复制列表初始化和继承构造函数,它会阻止一些隐式转换。
class Fuzz : public Foo {
using Foo::Foo;
void run() override {}
};
Bar b;
Fuzz f = {b}; // Error when Foo's c'tor is explicit
现在,这是非常具体的,但如果您的目标是防止隐式转换,并且考虑到 C++ 的初始化规则有多复杂,最好保持一致并且
explicit
。