关于 [over.match.funcs.general]/9 和继承的复制/移动构造函数的问题

mad*_*ada 5 c++ using-declaration language-lawyer overload-resolution c++20

根据\xc2\xa7 12.2.2.1 [over.match.funcs.general]/9-sentence-2

\n
\n

从类类型 C ([class.inhctor.init]) 继承的构造函数,\n其第一个参数类型为 \xe2\x80\x9c,引用 cv1 P\xe2\x80\x9d(包括从模板实例化的此类\n构造函数)当构造 cv2 D 类型的对象时,如果参数列表只有一个参数,并且 C 与 P 引用相关,并且 P 与 D 引用相关,则从候选函数集合中排除。

\n
\n

我只是想理解这一段,并以某种方式进行一个与措辞相匹配的示例,然后我想将该示例应用于该段落:

\n
struct P;\nstruct C { C(); C(const P&); };\nstruct P : C { using C::C; };\nstruct D : P {}; \n\nD d{ P() };\n
Run Code Online (Sandbox Code Playgroud)\n

从上面的例子来看:C与 引用相关PP与 引用相关D。还有一个从类类型继承的构造函数C,它的第一个参数类型为 \xe2\x80\x9c,引用cv1 P\xe2\x80\x9d。当构造一个类型的对象时cv D- 并且参数列表只有一个参数P()- 那么这个继承的构造函数将从候选函数集中排除。

\n

我的例子与措辞的意图相符吗?我是否正确理解和解析了措辞?另外,关于这一点还有其他措辞吗(继承复制/移动构造函数)?

\n

Dav*_*ing 2

此示例与继承构造函数无关:即使删除了其中一个或两个,它也可以C(const P&);工作using C::C;。它\xe2\x80\x99s通过为其一个子对象(基类)提供一个值来对a进行聚合初始化DP初始化。

\n

请注意,没有 \xe2\x80\x9c 编译器生成的D::D(const P&)\xe2\x80\x9d,尽管其效果与人们预期的类似。在 C++17 中,更改为D d((P()));失败,但 C++20 也允许聚合初始化。

\n