Qual'è la differenza tra `auto` e` std :: any`?

Oct 20 2020

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

17 cigien Oct 19 2020 at 23:25

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.

4 lvella Oct 19 2020 at 23:33

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.

ks1322 Oct 19 2020 at 23:34

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.