Какая разница между "auto pp" и "auto * ppp"?

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

Ответ 1

В конкретном примере, который вы показываете, нет никакой разницы. Но представьте, что позже вы добавите два 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 переменные, я бы посоветовал вам всегда использовать auto* при использовании вычитания типа для переменных указателя. Нет никакого способа, чтобы const -qualify сам указатель вместо pointee, и если вы хотите const -qualify, это возможно

const auto * const pppp = p;

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

Ответ 2

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

auto определитель:

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

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