我有这段代码:
na.omit
为什么可以为const int a = 10;
const auto *b = &a; //0x9ffe34
const auto c = &a; //0x9ffe34
int z = 20;
b = &z; //0x9ffe38
//c = &z; //[Error] assignment of read-only variable 'c'
而不是b
分配新地址?
答案 0 :(得分:13)
b
将推断为const int*
,这意味着非const 指针指向const int
,因此可以更改{b
的值1}}本身。
c
将推断为const int * const
,这意味着指向const int
的 const 指针,因此您无法更改{{1}的值本身。
<强>解释强>
对于这种情况,auto specifier将使用template argument deduction的规则。
一旦确定了初始值设定项的类型,编译器就会使用函数调用中的模板参数推导规则来确定将替换关键字auto的类型。
对于c
,const auto *b = &a;
为&a
,则const int*
将替换为auto
,然后int
将为b
1}}。
对于const int*
,const auto c = &a;
将替换为auto
,然后const int*
将为c
。请注意,const int* const
是const
中c
本身的限定符。