[dcl.fct.def] p2 сообщает:
Тип параметра или возвращаемого типа для определения функции не должен быть неполным или абстрактным (возможно, cv-квалифицированным) типом класса в контексте определения функции, если функция не удалена.
И [class.mem] p7 заявляет:
Класс считается полностью определенным типом объекта (или полным типом) при закрытии
}
спецификатора класса. Класс считается завершенным в контексте полного класса; в противном случае он считается неполным в пределах собственной спецификации члена класса.
Учитывая этот код:
struct S
{
// S is incomplete
S f() { /* S is complete in a function body */ return S(); }
// S is incomplete
};
// S is complete
контекст полного класса, в частности, не включает в себя decl-specier-seq определения функции и не включает в себя декларатор функции, однако каждый компилятор говорит, что это нормально. Какая формулировка позволяет это, поскольку я не могу найти это?