auto pp和auto * ppp有什么区别?

时间:2018-11-29 10:50:52

标签: c++ c++11 pointers auto

int foo = 11;
int *p = &foo;

auto pp = p;
auto *ppp = p;

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

该程序将为ppppp产生相同的输出,但是为什么呢? auto推断变量应该为int,因此我认为ppp的声明是正确的。但是ppppp具有相同的值...

输出:

0x61fefc
0x61fefc

2 个答案:

答案 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中,autoint匹配,这就是const适用的情况。

由于存在显着差异,并且由于我们应尽可能使用const变量,因此建议您在对指针变量使用类型推导时始终使用auto*。没有办法const限定指针本身而不是pointee,如果您想const限定两个指针,则可以通过

const auto * const pppp = p;

没有*就无法使用。

答案 1 :(得分:7)

在此特定情况下,autoauto *没有区别。如果是auto pp = p;类型,则推导为int *;如果是auto *ppp = p;类型,则推导为int

auto qualifier

  

对于变量,指定要从其初始值设定项自动推断出要声明的变量的类型。 [...]

请注意,与auto不同,auto *只能推断出指针类型。