Existem várias razões pelas quais eu não gosto de auto para uso geral:
- Você pode refatorar o código sem modificá-lo. Sim, essa é uma das coisas frequentemente listadas como um benefício do uso automático. Apenas altere o tipo de retorno de uma função e, se todo o código que a chama usar automático, nenhum esforço adicional será necessário! Você pressiona a compilação, cria - 0 avisos, 0 erros - e basta ir em frente e verificar seu código sem ter que lidar com a bagunça de olhar e modificar potencialmente os 80 locais em que a função é usada.
Mas espere, isso é realmente uma boa ideia? E se o tipo importasse em meia dúzia desses casos de uso e agora esse código realmente se comporte de maneira diferente? Isso também pode implicitamente quebrar o encapsulamento, modificando não apenas os valores de entrada, mas o próprio comportamento da implementação privada de outras classes que chamam a função.
1a. Eu acredito no conceito de "código de auto-documentação". O raciocínio por trás do código de auto-documentação é que os comentários tendem a ficar desatualizados, não refletindo mais o que o código está fazendo, enquanto o próprio código - se escrito de maneira explícita - é auto-explicativo, sempre atualizado por sua intenção e não o deixará confuso com comentários obsoletos. Se os tipos puderem ser alterados sem a necessidade de modificar o próprio código, os próprios códigos / variáveis poderão ficar obsoletos. Por exemplo:
auto bThreadOK = CheckThreadHealth ();
Exceto que o problema é que CheckThreadHealth () em algum momento foi refatorado para retornar um valor de enumeração indicando o status do erro, se houver, em vez de um bool. Mas a pessoa que fez essa alteração deixou de inspecionar essa linha de código específica e o compilador não ajudou em nada porque foi compilado sem avisos ou erros.
- Você pode nunca saber quais são os tipos reais. Isso também é frequentemente listado como um "benefício" primário do automóvel. Por que aprender o que uma função está lhe dando, quando você pode simplesmente dizer: "Quem se importa? Compila!"
Provavelmente até funciona. Eu digo que funciona, porque mesmo que você esteja fazendo uma cópia de uma estrutura de 500 bytes para cada iteração de loop, para que você possa inspecionar um único valor, o código ainda está completamente funcional. Portanto, mesmo seus testes de unidade não ajudam você a perceber que um código incorreto está escondido atrás desse automóvel simples e de aparência inocente. A maioria das outras pessoas que escaneiam o arquivo também não notará à primeira vista.
Isso também pode ser agravado se você não souber qual é o tipo, mas escolher um nome de variável que faça uma suposição errada sobre o que é, atingindo o mesmo resultado que em 1a, mas desde o início, em vez de pós-refatoração.
- Digitar o código ao escrever inicialmente não é a parte da programação que consome mais tempo. Sim, o modo automático torna a escrita de código mais rápida inicialmente. Como isenção de responsabilidade, digito> 100 WPM, então talvez isso não me incomode tanto quanto os outros. Mas se tudo o que eu precisava fazer era escrever um novo código o dia inteiro, eu seria um feliz campista. A parte da programação que consome mais tempo é diagnosticar erros de borda difíceis de reproduzir no código, geralmente resultantes de problemas sutis e não óbvios - como é provável que o uso excessivo de auto introduza (referência x cópia, assinado x não assinado, float x int, bool x ponteiro etc.).
Parece-me óbvio que o auto foi introduzido principalmente como uma solução alternativa para uma sintaxe terrível com os tipos de modelo de biblioteca padrão. Em vez de tentar corrigir a sintaxe do modelo com a qual as pessoas já estão familiarizadas - o que também pode ser quase impossível de executar devido a todo o código existente que pode ser quebrado -, adicione uma palavra-chave que basicamente oculte o problema. Essencialmente, o que você pode chamar de "hack".
Na verdade, eu não tenho nenhum desacordo com o uso de auto com contêineres de biblioteca padrão. Obviamente, é para isso que a palavra-chave foi criada, e as funções da biblioteca padrão provavelmente não mudam fundamentalmente de propósito (ou de tipo), tornando o automóvel relativamente seguro. Mas eu seria muito cauteloso ao usá-lo com seu próprio código e interfaces que podem ser muito mais voláteis e potencialmente sujeitas a mudanças mais fundamentais.
Outra aplicação útil do auto que aprimora a capacidade do idioma é criar temporários em macros agnósticas de tipo. Isso é algo que você realmente não podia fazer antes, mas pode fazê-lo agora.
auto
geralmente torna as coisas mais difíceis de ler quando elas já são difíceis de ler, ou seja, funções muito longas, variáveis com nomes inadequados etc. Em funções curtas com variáveis nomeadas decentemente, o conhecimento dos tipos deve ser um dos # 1 fáceis ou # 2 irrelevantes.