Можно ли использовать incomplete типы в специализациях шаблона?

Валидно ли использовать неполные типы в специализациях, определяя их не в хедерах, а в сорсах? Следующий пример компилируется, но не уверен что так можно

struct A;

namespace fmt{
template<>
struct formatter<A> : formatter<int> {
  auto format(A a, format_context& ctx) const;
};
}

struct A {
  int x=42;
};

namespace fmt{
auto formatter<A>::format(A a, format_context& ctx) const {
  return formatter<int>::format(a.x, ctx);
}
}

Ответы (1 шт):

Автор решения: HolyBlackCat

Да, так можно.

Тут два отдельных вопроса:

  • Можно ли специализировать incomplete типом? - Конечно да.

    (Непонятно как можно доказать отсутствие запрета, но есть же типы, которые никогда не могут быть complete: void, T[] (массив без указания размера). Для них тоже хочется делать специализации.)

  • Можно ли объявлять функцию с incomplete аргументом? Тут был не уверен, но экспериментально проверяется, что тоже можно (причем даже снаружи шаблона).

→ Ссылка