为什么自动说明符从 &指针推断出"顶部和低"级别的常量?

Why auto specifier deduce "top and low" level const from an &pointer?

本文关键字:常量 顶部 为什么 说明符 推断出 指针      更新时间:2023-10-16

我的代码是

const int *const ptrA = nullptr;
auto *ptrB = &ptrA; 

我从const int *const ptrA中了解到的是:

  • (*const)是"顶级常量"
  • (const int)是"低级常量">

因此,ptrB 必须是const int**类型。

我的问题是...

如果忽略"顶级常量",为什么ptrB不是const int**类型?

ptrB

的类型为const int* const*

ptrA本身是常量,指向常量int。你得到它的地址,因此ptrB指向常量指针到常量int。

顶级const在模板参数推导中确实被忽略了(就像volatile一样),但你没有任何顶级 const 限定符

你有&ptrA这是一个指向const int *const的指针,所以是一个const int *const*。不再有顶级const。这就是为什么ptrB属于const int *const*型 .

如果你有auto ptrB = ptrA;那么是的,顶级const将被忽略。

如果忽略"顶级常量",为什么ptrB不是const int**类型?

如果您使用以下内容,则会忽略它:

auto *ptrB = ptrA; 

然后,ptrB将是类型const int*.

但是,当您使用运算符的地址时,不会忽略顶级const

关于

因此,ptrB必须是const int**类型。

不,它是const int* const*型。如果类型声明为int const* const*,则会更容易阅读。ptrB是指向const的指针,指向const int的指针。

所以对于auto *ptrB = ptrA;,你的看法是正确的(导致auto=const int*ptrAconst int* const),

&ptrA的类型是const int *const*,没有const可以丢弃。