You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于const auto指针的疑问:为何i3案例可正常赋值?

为什么const auto i3 = new int;后能给*i3赋值?

先把你的测试代码格式化一下,方便对照:

int main() {
    int * i0 = new int;
    *i0 = 666; // OK

    const int * i1 = new int;
    *i1 = 666; // FAIL due to const

    auto i2 = new int;
    *i2 = 666; // OK

    const auto i3 = new int;
    *i3 = 666; // OK, WHY?

    const auto * i4 = new int;
    *i4 = 666; // FAIL due to const

    return 0;
}

这个问题的核心在于**const和auto结合时的修饰对象到底是谁**,很多人会混淆「顶层const」和「底层const」,咱们一步步拆解:

  • 先看你理解的i1:const int* i1里的const是底层const——它修饰的是指针指向的int类型,意思是「指针指向的内容不能被修改」,所以*i1 = 666;报错,这部分你完全正确。
  • 再看疑惑点i3:const auto i3 = new int;中,auto会推导new int的类型,也就是int*。而const是直接修饰变量i3本身的,所以推导后的完整类型是**int* const——这是一个顶层const**,意思是「指针变量i3本身不能被修改」(比如你不能写i3 = nullptr;),但指针指向的int内容是完全可以修改的,所以*i3 = 666;完全合法。
  • 对比i4:const auto* i4 = new int;里,auto推导的是int,加上const和*后,完整类型是const int*,回到了和i1一样的底层const情况,所以*i4 = 666;报错就很正常了。

简单记个小规则:

  • const auto → const修饰的是auto推导出的整个类型(顶层const)
  • const auto* → const修饰的是auto推导出的类型(底层const,指针指向的内容)

这样就能明白为什么i3可以正常赋值啦~

内容的提问来源于stack exchange,提问作者juzzlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:54:57