Qual é a diferença entre `auto` e` std :: any`?

Oct 20 2020

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

17 cigien Oct 19 2020 at 23:25

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.

4 lvella Oct 19 2020 at 23:33

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.

ks1322 Oct 19 2020 at 23:34

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.