Позвольте мне использовать последний текущий черновик пункта о вычете типов заполнителей: https://eel.is/c++draft/dcl.type.auto.deduct
Часть 3 читается (выделено жирным шрифтом от меня):
Если спецификатор типа-заполнителя имеет форму type-constraint(opt) auto, выведенный тип T'< /code> замена T определяется с использованием правил вывода аргументов шаблона. Если инициализация представляет собой инициализацию списка копирования, объявление std::initializer_list должно предшествовать ([basic.lookup.general]) спецификатору типа-заполнителя. Получите P из T, заменив вхождения type-constraint(opt) auto либо новым изобретенным параметром шаблона типа U, либо, если инициализация copy-list-initialization с помощью std::initializer_list. Выведите значение для U, используя правила вывода аргумента шаблона из вызова функции, где P — тип параметра шаблона функции, а соответствующий аргумент — E. Если вывод не удался, декларация имеет неправильную форму. В противном случае T' получается путем замены выведенного U на P.
Может ли кто-нибудь поделиться каким-либо примером с несколькими вхождениями (необязательно с ограничением по типу) auto внутри типа T, который должен быть тот же тип P?
Например, часть 4 со случаем decltype(auto), явно укажите ограничение:
... T должно быть единственным заполнителем...
что, похоже, подтверждает существование расширенных случаев (для auto).
Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-a-type