Qual é a diferença entre `auto` e` std :: any`?
Recentemente me deparei com a std::anyclasse, introduzida em C ++ 17, baseada em boost::any. Essa classe pode "conter uma instância de qualquer tipo" e autodeduz automaticamente o tipo de dados de uma variável.
Então, qual é a principal diferença? Quais são os prós e contras?
Respostas
std::anye autosão construções completamente diferentes.
std::any é um tipo de contêiner que pode conter um objeto de qualquer tipo:
std::any a = 42; // a holds an int, but type is std::any
a = std::string{"hi"}; // ok, a holds a string now
O tipo de objeto mantido por std::anypode mudar durante a execução do programa.
autoé uma palavra-chave que designa um tipo de espaço reservado. O tipo de uma variável com autoé o tipo do valor usado para inicializar a variável:
auto a = 42; // a is int, for the entirety of the program
a = std::string{"hi"}; // error, a has type int
Este tipo é determinado estaticamente, ou seja, em tempo de compilação, e nunca pode ser alterado durante a execução do programa.
Essas construções não são intercambiáveis e, portanto, têm casos de uso diferentes e não é possível comparar os prós e os contras de um com o outro de maneira significativa.
Se você escrever:
auto a = 42;
a = "some string";
você obtém um erro de compilação, porque aé um tipo de variável inte você não pode atribuir uma string a ela. A autopalavra-chave significa apenas que o compilador tomará a decisão de que tipo usar para você.
Agora, se você escrever:
std::any a = 42;
a = "some string";
Isso funcionará, porque o tipo de aé std::any, que é um tipo de classe complexo que usa modelos para armazenar qualquer tipo nos bastidores. Desnecessário dizer que é um tipo muito mais complexo do que int, e você só deve usá-lo quando for absolutamente necessário.
Qual é a principal diferença?
A principal diferença é que autoé uma coisa do tempo de compilação e std::anyé uma coisa do tempo de execução, embora possa ser dito que eles fazem logicamente a mesma coisa: eles podem armazenar uma variável de qualquer tipo.