是否有任何理由将抽象类的构造函数标记为显式

问题描述 投票:0回答:1

在下面的示例中,由于抽象方法

run
,我的类是抽象的。我还有一个来自另一种类型的构造函数。我总是将只有 1 个参数的构造函数标记为
explicit
,除非我希望隐式强制转换可用。但是,在抽象类的特殊情况下,有什么理由证明它是合理的吗?

class Foo
{
  public:
    virtual void run() = 0; // Then the class is abstract
    explicit Foo(Bar const& bar);
};

注意:我的问题纯粹是技术性的:有没有办法在抽象类的构造函数上使用或不使用显式关键字来实现不同的行为?

c++ abstract-class explicit explicit-constructor
1个回答
0
投票

但是,在抽象类的特殊情况下,有什么理由证明它是合理的吗?

如果您使用复制列表初始化和继承构造函数,它会阻止一些隐式转换

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

© www.soinside.com 2019 - 2024. All rights reserved.