提供显式扣除指南是否会禁用隐式扣除指南的生成/形成

Does providing an explicit deduction guide disable the generation/formation of implicit deduction guides

提问人:user12002570 提问时间:5/10/2022 最后编辑:user12002570 更新时间:5/10/2022 访问量:159

问:

我正在阅读有关 C++17 中的演绎指南。假设我们有以下示例:

template<typename T> struct Custom 
{
  
};
template<typename T> struct Person 
{
    Person(Custom<T> const&);
    Person(Custom<T>&&);
};
template<typename T> Person(Custom<T>) -> Person<T>; //explicitly declared deduction guide

我的问题是,如果我们没有指定明确的演绎指南,显式演绎指南的明确声明(如上所示)是否会禁用 2 个隐式演绎指南(对应于类模板的 2 个 ctors)的形成。我的意思是,假设在上面的例子中,没有显式演绎指南,那么就会有2个隐式演绎指南(对应于两个构造函数)。但是在我们添加显式扣款指南后,我们总共会有 1 个扣款指南(由我们用户明确声明)还是 3 个扣款指南(包括 2 个隐含扣款指南)。PersonPerson

PS:请注意,问题只在于 的演绎指南,而不是关于是否会形成隐式指南。PersonCustom

C++ C++17 语言律师 CTAD 演绎指南

评论


答:

8赞 Brian Bi 5/10/2022 #1

不,演绎指南声明不会抑制类模板参数演绎过程中隐式演绎指南的形成。重载集将同时包含两者。参见 [over.match.class.deduct]/1

...一组函数和函数模板,称为 的指南,包括:C

  • 如果定义了,则对于 的每个构造函数,具有以下属性的函数模板:...CC
  • 如果未定义或未声明任何构造函数,则从假设的构造函数派生出如上所述的附加函数模板。CC()
  • 如上所述,从假设的构造函数派生的附加函数模板,称为复制推导候选函数。C(C)
  • 对于每个演绎指南,一个具有以下属性的函数或函数模板:...

[省略与合计有关的补充规定......]

然而,在超载解决过程中,倒数第三个决胜局优先考虑扣除指南(明确声明的扣除指南)而不是隐式扣除指南[over.match.best.general]/2.10 中。只有在尝试了所有更一般的决胜局(与扣除指南没有直接关系)后,才能达到这个决胜局。

评论

2赞 Brian Bi 5/10/2022
@AnoopRana 如果您想查看编号,可以单击链接。我只是总结了与答案直接相关的部分,我相信在要点上添加编号会增加混乱,而不是使答案更易于阅读。
0赞 user12002570 5/10/2022
那么这是否意味着对于类模板,我们总共还有 3 个演绎指南?一个显式演绎指南,两个对应于 的 ctors。另请注意,我的问题只是关于 的演绎指南,而不是关于是否会形成隐式指南。PersonPersonPersonCustom
0赞 user12002570 5/10/2022
我看到这个答案有 2 个问题。1)格式太糟糕(这是我特有的)。2)答案没有清楚地回答我的问题。特别是,我特别问过,如果我错了,我们是否会有 1 或 3 个或更多的扣除指南。我建议相应地更新它。Person
0赞 Brian Bi 5/10/2022
@AnoopRana 的扣除指南数量是答案中所述内容的必然结果。第一个要点贡献了 2 个扣除指南,第三个贡献了 1 个,第四个贡献了 1 个。Person
0赞 user12002570 5/10/2022
好的,这个评论是答案中需要的(应该添加 IMO),以使答案更加清晰和完整。