В чем разница между `auto pp` и` auto * ppp`? - PullRequest
0 голосов
/ 29 ноября 2018
int foo = 11;
int *p = &foo;

auto pp = p;
auto *ppp = p;

cout << pp << endl;
cout << ppp << endl;

Эта программа выдаст одинаковый вывод для pp и ppp, но почему?auto выводит, что переменная должна быть int, поэтому я думаю, что объявление ppp правильно.Но pp и ppp имеют одинаковое значение ...

Вывод:

0x61fefc
0x61fefc

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

В конкретном примере, который вы показываете, нет никакой разницы.Но представьте, что позже вы добавите два const квалификатора, как показано ниже:

const auto pp = p;
const auto *ppp = p;

Это все то же самое?Оказывается, это идентично

int * const pp = p; // pointer is readonly
const int *ppp = p; // pointer is readonly

, потому что в auto pp = p, auto соответствует int* в целом, а const изменяет то, что слева (или то, что справа, еслитам ничего не осталось).Наоборот, в auto *ppp = p, auto соответствует int, и это то, к чему const относится.

Из-за этого заметного различия и потому, что мы должны использовать const переменные, когда это возможно, я 'd советую всегда использовать auto* при использовании вывода типа для переменных-указателей.Невозможно const -квалифицировать сам указатель вместо pointee, и если вы хотите const -квалифицировать оба, это возможно с помощью

const auto * const pppp = p;

, который не работает без*.

0 голосов
/ 29 ноября 2018

В данном конкретном случае нет разницы в auto и auto *.В случае auto pp = p; тип будет выведен на int *, а в случае auto *ppp = p; тип будет выведен на int.

auto квалификатор :

Для переменных указывает, что тип объявленной переменной будет автоматически выводиться из ее инициализатора.[...]

Обратите внимание, что в отличие от auto auto * будет выводить только типы указателей.

...