【问题标题】:What's the difference between `auto pp` and `auto *ppp`?`auto pp` 和 `auto *ppp` 有什么区别?
【发布时间】:2018-11-29 10:50:52
【问题描述】:
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

【问题讨论】:

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


    【解决方案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 指针本身而不是指针,如果你想 const-qualify 两者,这可以通过

    const auto * const pppp = p;
    

    如果没有*,这将无法工作。

    【讨论】:

    • 微妙,重要的是要知道,我不记得在最近的任何 C++ 书籍中读过这个,例如,Stroustrup 的Tour 2nd ed。 (我可能错过了。)
    • 实际上您没有将 const 限定符 添加到两个变量。相反,您将其添加到第一个变量和第二个变量的指针。
    • @davidbak 我同意,这不是很明显。它曾经咬过我一次,因为痛苦的学习非常有效,我记得从那时起:)
    • 耶! 痛苦的学习非常有效,但不幸的是耗时(有时令人沮丧)。阅读一个很好的解释(让事情变得显而易见)是第二好的选择(而且耗时更少)。
    【解决方案2】:

    在这种特殊情况下,auto 和 auto * 没有区别。在auto pp = p; 的情况下,类型将被推断为int *,而在auto *ppp = p; 的情况下,类型将被推断为int。

    auto qualifier:

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

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

    【讨论】:

    • 关键是auto使用模板参数推导规则,所以auto*只会推导指针类型。
    • @rustyx;我添加了特殊情况。
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2014-02-17
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多