This is a matter of logic. Why, for example, the functions have the return set:
int main(){
//Na main o retorno é de um inteiro, se o programa executar normalmente retorna 0.
auto v1 = 56; //O auto é um tipo indefinido, tem que ser inicializada para saber qual tipo.
return 0;
}
In this example you asked in your question.
auto add(const auto& x, const auto& y)
{
return x + y; //não compila porque o auto é indefinido então o compilador não vai saber qual
//é o retorno. Mesmo usando em parâmetros também não dá certo
}
auto add = [](const auto& x, const auto& y) //Já aqui nessa parte ele aceita.
{
//Uma parte porque ela é inicializada como uma função.
//A outra em forma de função não lambda não acontece pois o compilador não irá saber se é
//um retorno, por exemplo, int, double, float, char, const char* entre outros.
return x + y;
}
Already in a template:
template <typename in, typename out> out func(in _valor){
//...
//Podemos usar o template em retorno e em entrada pois quando for chamar
//indicaremos o tipo a cada typename como float para entrada e int para saída.
}