Прочитав 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, я могу понять комментарий после второго объявления для имени f
, потому что первое объявление и второе объявление соответствуют друг другу, и они объявили один и тот же объект , однако они нарушают следующее правило:
Для любых двух объявлений объекта
Если один объявляет его как переменную или функцию, другой должен объявить его как один из того же типа.
Честно говоря, я не могу понять комментарии после последнего объявления имени g
. IIUC, эти три объявления для имени g
не соответствуют друг другу. Из-за следующего правила:
Два объявления соответствуют, если они (повторно) вводят одно и то же имя, оба объявляют конструкторы или оба объявляют деструкторы, если только:
- [...]
- каждый объявляет функцию или шаблон функции, за исключением случаев, когда
- обе объявляют функции с одним и тем же списком типов параметров[Примечание: неявный параметр объекта ([over.match.funcs]) не является частью списка типов параметров. — конец сноски], эквивалентные ([temp.over.link]) конечные обязательные пункты (если есть, за исключением случаев, указанных в [temp.friend]), и, если оба являются нестатическими элементами, одно и то же cv -qualifiers (если есть) и ref-qualifier (если они есть у обоих)
Хотя у них один и тот же список типов параметров, все они являются нестатическими членами и не имеют одинаковых квалификаторов cv и квалификаторов ссылок, поэтому они не являются соответствующими объявлениями. Я не могу найти ни одного правила, в котором говорилось бы, что такие объявления для g
являются неправильными в P1787, так как же интерпретировать комментарий?