关于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
相关产品推荐
相关产品推荐

