P1787中一组非静态成员函数是否可以重载的替代规则
The alternative rule in P1787 for whether a set of non-static member functions can be overloaded
看完P1787,我对这个例子中的注释有点迷惑。即:
struct X {
static void f();
void f() const; // error: redeclaration
void g();
void g() const; // OK
void g() &; // error: redeclaration
};
显然,如果按照当前标准 over.load,它们是无效的重载声明。但是,该子条款已在 P1787 中删除。
根据P1787中的说法,我可以理解第二次声明name f
后的注释,因为第一次声明和第二次声明是对应的,他们声明了同一个实体,但是,他们违反了以下规则:
For any two declarations of an entity
If one declares it to be a variable or function, the other shall declare it as one of the same type.
坦率地说,我无法理解最后声明名称 g
后的评论。 IIUC,name g
的这三个声明不对应。由于以下规则:
Two declarations correspond if they (re)introduce the same name, both declare constructors, or both declare destructors, unless:
- [...]
- each declares a function or function template, except when
- both declare functions with the same parameter-type-list[Footnote: An implicit object parameter ([over.match.funcs]) is not part of the parameter-type-list. — end footnote], equivalent ([temp.over.link]) trailing requires-clauses (if any, except as specified in [temp.friend]), and, if both are non-static members, the same cv-qualifiers (if any) and ref-qualifier (if both have one)
尽管它们具有相同的参数类型列表,但它们都是非静态成员并且没有相同的 cv-qualifiers 和 ref-qualifier,因此它们'不是相应的声明。我找不到任何规则说 g
的此类声明在 P1787 中格式不正确,那么如何解释评论?
ref-qualifier 只需相同"(如果两者都有)".
如果只有一个声明有 ref 限定符而另一个没有,则该措辞暗示两个声明对应,假设所有其他条件都满足。
在提供的示例中,这意味着 void g() &;
是 void g();
的重新声明。
看完P1787,我对这个例子中的注释有点迷惑。即:
struct X {
static void f();
void f() const; // error: redeclaration
void g();
void g() const; // OK
void g() &; // error: redeclaration
};
显然,如果按照当前标准 over.load,它们是无效的重载声明。但是,该子条款已在 P1787 中删除。
根据P1787中的说法,我可以理解第二次声明name f
后的注释,因为第一次声明和第二次声明是对应的,他们声明了同一个实体,但是,他们违反了以下规则:
For any two declarations of an entity
If one declares it to be a variable or function, the other shall declare it as one of the same type.
坦率地说,我无法理解最后声明名称 g
后的评论。 IIUC,name g
的这三个声明不对应。由于以下规则:
Two declarations correspond if they (re)introduce the same name, both declare constructors, or both declare destructors, unless:
- [...]
- each declares a function or function template, except when
- both declare functions with the same parameter-type-list[Footnote: An implicit object parameter ([over.match.funcs]) is not part of the parameter-type-list. — end footnote], equivalent ([temp.over.link]) trailing requires-clauses (if any, except as specified in [temp.friend]), and, if both are non-static members, the same cv-qualifiers (if any) and ref-qualifier (if both have one)
尽管它们具有相同的参数类型列表,但它们都是非静态成员并且没有相同的 cv-qualifiers 和 ref-qualifier,因此它们'不是相应的声明。我找不到任何规则说 g
的此类声明在 P1787 中格式不正确,那么如何解释评论?
ref-qualifier 只需相同"(如果两者都有)".
如果只有一个声明有 ref 限定符而另一个没有,则该措辞暗示两个声明对应,假设所有其他条件都满足。
在提供的示例中,这意味着 void g() &;
是 void g();
的重新声明。