Когда я использую auto
для вывода типа указателя, я обнаружил странное явление. Мой код выглядит так:Использование auto в C++ 11
#include <iostream>
using namespace std;
int main()
{
int i = 100;
auto p1 = &i;
auto *p2 = &i;
cout << *p1 << " " << *p2 << endl;
return 0;
}
После компиляции и выполнения, мы можем обнаружить, что результат *p1
и *p2
такой же, как 100. Это означает, что p1
и p2
оба объекта указатель, который указывает на int
объект.
[[email protected] ~]$ ./test
100 100
Есть ли разница между этими двумя утверждениями, которые определяют p1
и p2
?
Конечно, что еще может произойти? Если p1 и p2 не оба указателя, вы не можете инициализировать их с помощью '& i'.Может быть, вы должны написать (и подумать) в терминах 'auto * p2'' '' '' '' '' '' '' '' '', чтобы было ясно, что '' p2' является переменной типа указателя, с указанным типом, автоматически выведенным компилятором , –
'auto * p2 = init()' устанавливает тип необработанного указателя. Может быть полезно, если, например, someday 'init()' реорганизуется для возврата 'shared_ptr' и вместо копирования этого значения и сохранения этого 'T' в памяти вы получаете ошибку компиляции и имеете возможность решить, использовать ли' shared_ptr ',' weak_ptr ', или' T & '. –
jingyu9575
Вот почему 'auto' является одновременно магическим и потенциально запутанным. –