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
答案 0 :(得分:30)
在您显示的特定示例中,没有区别。但想像一下您稍后会添加两个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
限定指针本身而不是pointee,如果您想const
限定两个指针,则可以通过
const auto * const pppp = p;
没有*
就无法使用。
答案 1 :(得分:7)
在此特定情况下,auto
和auto *
没有区别。如果是auto pp = p;
类型,则推导为int *
;如果是auto *ppp = p;
类型,则推导为int
。
对于变量,指定要从其初始值设定项自动推断出要声明的变量的类型。 [...]
请注意,与auto
不同,auto *
只能推断出指针类型。