没有默认ctor的间接虚拟基会阻止子级拥有默认ctor,除非中间的每个类也有一个

我很抱歉这个晦涩的标题,不知道如何更好地表达它。

考虑以下继承层次结构:

struct A
{
    A(int) {}
};

struct B : virtual A
{
    B() : A(42) {}
};

struct C : B
{
    C() : A(43) {}
};

它确实有效。现在假设我想创建一个可以在层次结构中间透明注入的模板,如下所示:

template <typename ...P>
struct Proxy : P...
{
    // This constructor doesn't change anything. It was added
    // to indicate that `Proxy` should only be used as a base.
  protected:
    Proxy() = default;
};

struct D : Proxy<B>
{
    D() : A(44) {}
};

这给了我:error: call to implicitly-deleted default constructor of 'Proxy<B>'

Run on gcc.godbolt.org

我明白发生了什么:Proxy不能有默认构造函数,因为它没有为 提供初始值设定项A,因此派生类不能 default-construct Proxy

但是仔细想想这没有意义,因为即使我为Ain提供了一个初始值设定项ProxyD也会忽略它并且必须提供它自己的初始值设定项。

我该如何解决这个限制?

代码中的所有内容都可以更改,但我更喜欢侵入性较小的更改。


在我实际的代码中,只有一个基类,导致这些问题,所以我做了两个不同的默认构造函数Proxy(有区别requires):一个无所事事,另(这是用来当任何P...从几乎继承A)传递一个虚拟参数到A::A(int)

但我不喜欢这个解决方案,因为它不是通用的,所以我正在寻找更好的替代方案。

以上是没有默认ctor的间接虚拟基会阻止子级拥有默认ctor,除非中间的每个类也有一个的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>