[dcl.fct.def.general] / 2 :
Тип параметра или тип возвращаемого значения для определения функции не должен бытьнеполный или абстрактный (возможно, cv-квалифицированный) тип класса в контексте определения функции, если только функция не удалена ([dcl.fct.def.delete]).
Но [dcl.spec.auto] / 10 :
Вывод типа возврата для шаблона функции с заполнителем в объявленном типе происходит, когда создается определение, даже если тело функции содержитreturn
оператор с не зависящим от типа операндом.
Итак, с B
оно плохо сформировано первым правилом.Но с auto
вычитание не происходит до тех пор, пока не будет создан экземпляр функции ... к этому моменту тип завершен, так что все в порядке.
Обратите внимание, что первое правило применяется только к определению, котороеВот почему do_f()
хорошо.Вы можете иметь объявления, которые возвращают неполные типы.
Приведенная выше формулировка технически не применима к этому делу.У нас нет шаблона функции.Но цель состоит в том, чтобы применить это к любому виду шаблонов.Существует PR , чтобы редактировать это из:
Вывод типа возврата для шаблона функции с заполнителем [...]
Кому:
Возвращение типа вычета для шаблонного объекта, который является функцией или шаблоном функции с заполнителем в его
, которыйздесь применимо.