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\n从类类型 C ([class.inhctor.init]) 继承的构造函数,\n其第一个参数类型为 \xe2\x80\x9c,引用 cv1 P\xe2\x80\x9d(包括从模板实例化的此类\n构造函数)当构造 cv2 D 类型的对象时,如果参数列表只有一个参数,并且 C 与 P 引用相关,并且 P 与 D 引用相关,则从候选函数集合中排除。
\n
我只是想理解这一段,并以某种方式进行一个与措辞相匹配的示例,然后我想将该示例应用于该段落:
\nstruct P;\nstruct C { C(); C(const P&); };\nstruct P : C { using C::C; };\nstruct D : P {}; \n\nD d{ P() };\nRun Code Online (Sandbox Code Playgroud)\n从上面的例子来看:C与 引用相关P和P与 引用相关D。还有一个从类类型继承的构造函数C,它的第一个参数类型为 \xe2\x80\x9c,引用cv1 P\xe2\x80\x9d。当构造一个类型的对象时cv D- 并且参数列表只有一个参数P()- 那么这个继承的构造函数将从候选函数集中排除。
我的例子与措辞的意图相符吗?我是否正确理解和解析了措辞?另外,关于这一点还有其他措辞吗(继承复制/移动构造函数)?
\n此示例与继承构造函数无关:即使删除了其中一个或两个,它也可以C(const P&);工作using C::C;。它\xe2\x80\x99s通过为其一个子对象(基类)提供一个值来对a进行聚合初始化DP初始化。
请注意,没有 \xe2\x80\x9c 编译器生成的D::D(const P&)\xe2\x80\x9d,尽管其效果与人们预期的类似。在 C++17 中,更改为D d((P()));失败,但 C++20 也允许聚合初始化。
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |