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

廖茂生*_*廖茂生 20 c++ pointers auto c++11

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

auto pp = p;
auto *ppp = p;

cout << pp << endl;
cout << ppp << endl;
Run Code Online (Sandbox Code Playgroud)

这个程序会为pp和产生相同的输出ppp,但为什么呢?auto推断变量应该是int,所以我认为声明ppp是对的.但是pp并且ppp具有相同的价值......

输出:

0x61fefc
0x61fefc
Run Code Online (Sandbox Code Playgroud)

lub*_*bgr 30

在您展示的特定示例中,没有区别.但想象一下,您稍后会添加两个const限定符,如下所示:

const auto pp = p;
const auto *ppp = p;
Run Code Online (Sandbox Code Playgroud)

还是一样吗?原来这是相同的

int * const pp = p; // pointer is readonly
const int *ppp = p; // pointer is readonly
Run Code Online (Sandbox Code Playgroud)

因为in auto pp = p,auto匹配int*作为一个整体,并const修改其左侧的内容(或右侧的内容,如果左侧没有任何内容).相反,在auto *ppp = p,auto匹配int,这const适用于.

由于这个显着的差异,并且因为我们应该尽可能使用const变量,我建议你在auto*对指针变量使用类型推导时总是使用.没有办法对const指针本身而不是指针对象进行const限定,如果你想对两者都进行限定,这是可能的

const auto * const pppp = p;
Run Code Online (Sandbox Code Playgroud)

没有这个就行不通*.

  • @davidbak我同意,这不是很明显.它咬了我一次,因为痛苦的学习非常有效,我记得从那以后:) (2认同)
  • Yepppp!_Painful学习非常有效_但不幸的是耗时(有时令人沮丧).阅读一个很好的解释(使事情变得明显)是第二个最佳选择(而且耗时少得多). (2认同)

hac*_*cks 7

有一个在没有任何区别auto,并auto *在这种特殊情况下.在auto pp = p;类型的情况下将被推断为int *auto *ppp = p;类型的情况下将被推断为int.

auto限定符:

对于变量,指定将从其初始化程序自动推导出正在声明的变量的类型.[...]

请注意,与autoauto *会推断仅指针类型.

  • 关键点是`auto`使用模板参数推导规则,所以`auto*`只会推导出指针类型. (6认同)