Я не верю, что есть способ обойти это.Вы создаете лямбда со следующим определением:
[](auto&& self, int n) {
if (n<=1) return 1;
return n*self(n-1);
}
Это означает:
struct lambda
{
template <typename T1>
constexpr auto operator()(T1&&self, int n) const
{
if (n<=1)
return 1;
return n*self(n-1);
}
};
Учитывая этот код, ваш компилятор должен вывести тип возвращаемого значения как общий тип возвращаемого значения 2операторов.
С вашим шаблоном instation, прежде всего, необходимо знать тип возвращаемого вами экземпляра, прежде чем вычислять ответ этого экземпляра.
В этом конкретном случае все еще возможновыведите это правильно.Что произойдет, если вы добавите дополнительные косвенные ссылки и вернетесь к своему типу?