6

basic.scope #scope-3.3.1

两者都声明具有相同参数类型列表的函数,等效 ([temp.over.link]) 尾随要求子句(如果有,除非 [temp.friend] 中指定),并且如果两者都是非静态成员, 相同的 cv 限定符(如果有)ref 限定符(如果两者都有)

上面的规则可以理解为,对于两个具有相同参数类型列表的非静态成员函数,如果任何人有一个 cv-qualifiers 那么两个声明应该有相同的 cv-qualifiers;如果两个声明都有 ref-qualifier,它们应该有相同的 ref-qualifier。否则,它们不对应。

struct A{
    void show();  //#1
    void show() const &;  //#2
};

在这个片段中,#1 是否对应于#2?由于#2 有一个 cv-qualifier 但#1 没有,即使具有相同的条件为 ref-qualifier真,根据规则(注意强调的 在该规则中),它们不对应。那么,这是否意味着草案允许从这两个声明中形成一个重载集?毕竟,over.load#2.3部分已被 P1787 删除。

4

1 回答 1

0

这种变化是更正交地表述规则的无意结果,但由于这种正交性允许一些额外的有意义的重载集,所以并不急于“修复”它。特别是,它可能适用于目前正在考虑的推论建议。this

于 2021-05-13T14:57:30.037 回答