Самый очевидный ответ мог бы быть - , потому что стандарт так говорит .
Это нормально, но я оборачиваюсь вокруг этого, чтобы понять причины этого выбора.
Рассмотрим следующий пример:
template<typename T>
struct S { S(T) {} };
S f() { return 0; }
int main() {
auto s = f();
(void)s;
}
Не удается скомпилировать с ошибками типа:
ошибка: использование шаблона класса 'S' требует аргументов шаблона;вычет аргументов не разрешен в функции, тип возврата
Довольно легко исправить, это не проблема, что-то вроде этого работает просто отлично:
auto f() { return S{0}; }
Однако я бы хотелхотелось бы понять, что было недостатками в разрешении вывода аргументов шаблона класса и в типах, возвращаемых функциями.
На первый взгляд, это выглядит как глупое ограничение, но я почти уверен, что здесь упущено что-то важное.