gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:09:00 24 4
gpt4 key购买 nike

我很抱歉这个晦涩的标题,不知道如何更好地表达它。
考虑以下继承层次结构:

struct A
{
A(int) {}
};

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

struct C : B
{
C() : A(43) {}
};
它确实有效。现在假设我想创建一个可以透明地注入(inject)到层次结构中间的模板,如下所示:
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 提供初始化器,因此派生类不能默认构造 Proxy .
但是如果你仔细想想它是没有意义的,因为即使我为 A 提供了一个初始化程序。在 Proxy , D会忽略它,并且必须提供自己的。
我该如何解决这个限制?
代码中的所有内容都可以更改,但我更喜欢侵入性较小的更改。

在我的实际代码中,只有一个基类会导致这些问题,因此我为 Proxy 创建了两个不同的默认构造函数。 (以 requires 区分):一个什么都不做,另一个(当 P... 中的任何一个实际上继承自 A 时使用)将虚拟参数传递给 A::A(int) .
但我不喜欢这个解决方案,因为它不是通用的,所以我正在寻找更好的替代方案。

最佳答案

[special]/7 :

For a class, its non-static data members, its non-virtual direct baseclasses, and, if the class is not abstract ([class.abstract]), itsvirtual base classes are called its potentially constructedsubobjects.


[class.default.ctor]/2.7表示默认的默认构造函数被定义为已删除,如果

any potentially constructed subobject, except for a non-static datamember with a brace-or-equal-initializer, has class type M (or arraythereof) and either M has no default constructor or overloadresolution ([over.match]) as applied to find M's correspondingconstructor results in an ambiguity or in a function that is deletedor inaccessible from the defaulted default constructor


因此,我们可以通过设置 Proxy 从可能构造的子对象集合中排除虚拟基。抽象的,例如通过使析构函数纯虚拟(但仍提供定义):
template <typename ...P>
struct Proxy : P...
{
protected:
virtual ~Proxy() = 0;
Proxy() = default;
};

template <typename ...P>
Proxy<P...>::~Proxy() = default;

关于c++ - 没有默认 ctor 的间接虚拟基会阻止子级拥有默认 ctor,除非中间的每个类也有一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67558962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com