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

В basic.scope#scope-3.3.1 говорится

обе объявляют функции с одним и тем же списком-тип-параметра, эквивалентными ([temp.over.link]) конечными требующими-предложениями (если есть, кроме указанных в [temp.friend]) и, если оба являются нестатическими членами , одинаковые cv-квалификаторы (если есть) и ref-qualifier (если они есть у обоих)

Вышеупомянутое правило можно понять так: для двух нестатических функций-членов с одним и тем же списком типов-параметров, если у кого-то есть квалификаторы cv, тогда оба объявления должны иметь одинаковые квалификаторы cv; если оба объявления имеют квалификатор ref, они должны иметь один и тот же квалификатор ref. В противном случае они не соответствуют.

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

В этом фрагменте: соответствует ли №1 №2? Поскольку № 2 имеет cv-квалификатор, а № 1 его нет, даже если условие наличия такого же верно, согласно правилу (обратите внимание на выделенное и в этом правиле), они не соответствуют. Итак, означает ли это, что черновик разрешает формировать набор перегрузки из таких двух деклараций? Ведь раздел over.load#2.3 был удален P1787.

1 ответ

Это изменение было непреднамеренным результатом более ортогональной формулировки правил , но поскольку такая ортогональность допускает несколько дополнительных значимых наборов перегрузки, не было никакой спешки, чтобы «исправить» это. В частности, это может хорошо работать с предложением о выводе this это в настоящее время рассматривается.

Другие вопросы по тегам