Qual'è la differenza tra `auto` e` std :: any`?
Recentemente mi sono imbattuto nella std::anyclasse, introdotta in C ++ 17, basata su boost::any. Questa classe può "contenere un'istanza di qualsiasi tipo" e autodeduce automaticamente il tipo di dati di una variabile.
Allora qual è la differenza principale? Quali sono i pro e i contro?
Risposte
std::anye autosono costrutti completamente diversi.
std::any è un tipo di contenitore che può contenere un oggetto di qualsiasi tipo:
std::any a = 42; // a holds an int, but type is std::any
a = std::string{"hi"}; // ok, a holds a string now
Il tipo di oggetto tenuto da std::anypuò cambiare durante l'esecuzione del programma.
autoè una parola chiave che designa un tipo di segnaposto. Il tipo di una variabile con autoè il tipo del valore utilizzato per inizializzare la variabile:
auto a = 42; // a is int, for the entirety of the program
a = std::string{"hi"}; // error, a has type int
Questo tipo è determinato staticamente, cioè in fase di compilazione, e non può mai cambiare durante l'esecuzione del programma.
Questi costrutti non sono intercambiabili, quindi hanno casi d'uso diversi e non è possibile confrontare i pro e i contro dell'uno rispetto all'altro in modo significativo.
Se scrivi:
auto a = 42;
a = "some string";
ottieni un errore di compilazione, perché aè una variabile di tipo inte non puoi assegnarle una stringa. La autoparola chiave significa solo che il compilatore deciderà quale tipo utilizzare per te.
Ora, se scrivi:
std::any a = 42;
a = "some string";
Funzionerà, perché il tipo di aè std::any, che è un tipo di classe complesso che utilizza modelli per archiviare dietro le quinte qualsiasi tipo per te. Inutile dire che è un tipo molto più complesso di int, e dovresti usarlo solo quando assolutamente necessario.
Qual è la differenza principale?
La differenza principale è che autoè una cosa in fase di compilazione ed std::anyè una cosa in runtime mentre si può dire che logicamente fanno la stessa cosa: possono memorizzare una variabile di qualsiasi tipo.