Com o GCC 4.8.0 lançado, temos um compilador que oferece suporte à dedução automática de tipo de retorno, parte do C ++ 14. Com -std=c++1y
, eu posso fazer isso:
auto foo() { //deduced to be int
return 5;
}
Minha pergunta é: quando devo usar esse recurso? Quando é necessário e quando torna o código mais limpo?
Cenário 1
O primeiro cenário em que consigo pensar é sempre que possível. Toda função que pode ser escrita dessa maneira deve ser. O problema é que nem sempre o código fica mais legível.
Cenário 2
O próximo cenário é evitar tipos de retorno mais complexos. Como um exemplo muito leve:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Eu não acredito que isso seja realmente um problema, embora eu ache que o tipo de retorno dependa explicitamente dos parâmetros possa ser mais claro em alguns casos.
Cenário 3
Em seguida, para evitar redundância:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
No C ++ 11, às vezes podemos apenas return {5, 6, 7};
substituir um vetor, mas isso nem sempre funciona e precisamos especificar o tipo no cabeçalho da função e no corpo da função. Isso é puramente redundante, e a dedução automática do tipo de retorno nos salva dessa redundância.
Cenário 4
Finalmente, ele pode ser usado no lugar de funções muito simples:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Às vezes, porém, podemos olhar para a função, querendo saber o tipo exato, e se ela não for fornecida, precisamos ir para outro ponto do código, como onde pos_
é declarado.
Conclusão
Com os cenários apresentados, quais deles realmente provam ser uma situação em que esse recurso é útil para tornar o código mais limpo? E os cenários que deixei de mencionar aqui? Que precauções devo tomar antes de usar este recurso para que ele não me morda mais tarde? Existe algo novo que esse recurso traga para a mesa que não seja possível sem ele?
Observe que as múltiplas perguntas devem ajudar a encontrar perspectivas para responder a isso.
->decltype(t+u)
pela dedução automática mata o SFINAE.