Quando uso auto
per dedurre un tipo di puntatore, ho trovato un fenomeno strano. Il mio codice è simile a questo:Uso di auto in C++ 11
#include <iostream>
using namespace std;
int main()
{
int i = 100;
auto p1 = &i;
auto *p2 = &i;
cout << *p1 << " " << *p2 << endl;
return 0;
}
Dopo la compilazione e l'esecuzione, possiamo trovare che il risultato di *p1
e *p2
è la stessa, sia 100. Questo significa p1
e p2
sono entrambi un oggetto puntatore che punta a un int
oggetto.
[[email protected] ~]$ ./test
100 100
C'è qualche differenza tra queste due affermazioni che definiscono p1
e p2
?
Ovviamente, cos'altro potrebbe accadere? Se p1 e p2 non erano entrambi i puntatori, non è possibile inizializzarli con '& i'.Forse dovresti scrivere (e pensare) in termini di 'auto * p2' not' auto * p2' per chiarire che 'p2' è una variabile di un tipo di puntatore, con il tipo puntato automaticamente dedotto dal compilatore . –
'auto * p2 = init()' impone il tipo di puntatore non elaborato. Potrebbe essere utile se ad es. un giorno 'init()' è refactored per restituire 'shared_ptr' e invece di copiare questo valore e mantenere quel 'T' in memoria, si ottiene un errore di compilazione e si ha la possibilità di decidere se usare' shared_ptr ',' weak_ptr ', o' T & '. –
jingyu9575
Ecco perché 'auto' è sia magico che potenzialmente confuso. –