вывод типа в variadic templates

Есть рабочий код подсчёта суммы всех аргументов функции через variadic templates. Не могу понять какой возвратный тип используется "под" auto. Через fold expressions было бы удобнее, но очень хочется понять, можно ли задать вместо auto тип и если да, то какой?

#include <iostream>

auto func() {
    return 0;
}

template<typename T, typename...A>

auto func(T s, A...args) {
    return s + func(args...);
}

int main()
{
    std::cout << func(4.9, 1.7, 11, 19.6, 23) << std::endl; // Вывод: 62.2

    return 0;
}

P.S Уважаемый @Harry подсказал, что тип можно вывести посредством std::common_type. Немного подкорректировал. Можно ли считать эти правки корректными? Код компилируется

#include <iostream>

template <typename T = int>
typename std::common_type<T>::type func() {
    return 0;
}

template<typename T, typename...A>

typename std::common_type<T, A...>::type func(T s, A...args) {
    return s + func(args...);
}

int main()
{
    std::cout << func(4.9, 1.7, 11, 19.6, 23) << std::endl;

    return 0;
}

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

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

какой возвратный тип используется "под" auto

Непонятен ход мыслей. Что не так с auto? (Или с decltype?)

Если вы спрашиваете, есть ли в <type_traits> какой-то шаблон, который выдает возвращаемый тип +, то ответ - нет. И непонятно, зачем он был бы нужен, если можно руками написать decltype.

тип можно вывести посредством std::common_type

Можно, но не для всех типов. Для чисел - работает, а для строк, например - нет. (Хотя для строк и сложение с 0 не работает...)

Через fold expressions было бы удобнее

Тело функции с ними будет выглядеть лучше, но с возвращаемым типом это никак не помогает.

→ Ссылка