Альтернативное правило в P1787, определяющее, можно ли перегружать набор нестатических функций-членов.

Прочитав 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, так как же интерпретировать комментарий?


person xmh0511    schedule 25.11.2020    source источник


Ответы (1)


Только квалификатор ref должен быть одинаковым (если он есть у обоих).

Если только одно объявление имеет квалификатор ref, а другое нет, формулировка подразумевает, что два объявления соответствуют друг другу, при условии, что все остальные условия выполнены.

В приведенном примере это означает, что void g() &; является повторным объявлением void g();.

person Patrick Roberts    schedule 25.11.2020
comment
Упс, это мое неправильное прочтение. Итак, void g() &; и void g(); соответствуют друг другу и объявляют одну и ту же сущность. однако они нарушают правило 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. Верно? - person xmh0511; 25.11.2020
comment
@jackX да, это правильно. Извините, я просматривал параграф 9 из [basic.link], чтобы подтвердить связь между процитированным вами правилом и [basic.scope.scope]. - person Patrick Roberts; 25.11.2020
comment
Соответствующее правило: Два объявления сущностей объявляют одну и ту же сущность, если, учитывая объявления безымянных типов для введения их имен для целей компоновки, если таковые имеются ([dcl.typedef], [dcl.enum]), они соответствуют< /b> ([basic.scope.scope]), имеют ту же целевую область, которая не является областью действия или параметра шаблона, и либо: они появляются в одной и той же единице перевода. До сих пор этого достаточно, чтобы доказать, что они должны быть одной и той же сущностью. - person xmh0511; 25.11.2020
comment
@jackX да, это то, что я просмотрел, прежде чем ответить ... - person Patrick Roberts; 25.11.2020
comment
Итак, насчет cv-qualifiers, если одно из этих объявлений есть, то все они должны иметь одинаковые cv-qualifiers, чтобы они соответствовали, иначе они не соответствуют, верно? - person xmh0511; 25.11.2020
comment
@jackX комбинация const и volatile должна быть одинаковой для двух объявлений функций, чтобы они соответствовали друг другу. - person Patrick Roberts; 25.11.2020
comment
Это мой смысл. Другое дело с ref-qualifier, требование которого состоит в том, что сначала два объявления должны иметь ref-qualifier, а затем сравнить, имеют ли они одинаковые ref-qualifier, если да, то они соответствуют. - person xmh0511; 25.11.2020