为什么对指针的引用在行为上与对非指针的引用不同?

编程语言 2026-07-09

我在试着理解,为什么对一个指针的引用与对一个非指针的引用的行为会不同。

下面的程序在Clang下编译失败:

int main()
{
    int i = 42;
    int *pi_i = &i;
    const int *&rpi_i = pi_i;
}

编译器输出:

e.cpp:4:17: error: binding reference of type 'const int *&' to value of type 'int *' not permitted due to incompatible qualifiers
    const int *&rpi_i = pi_i;
                ^       ~~~~

如果把pi_i改为具有const int*类型,错误就会消失:

int main()
{
    int i = 42;
    const int *pi_i = &i;
    const int *&rpi_i = pi_i;
}

如果把引用类型改成int*&,错误也会消失:

int main()
{
    int i = 42;
    int *pi_i = &i;
    int *&rpi_i = pi_i;
}

然而,类似的非指针代码可以正常编译:

int main()
{
    int i = 42;
    const int &ri = i;
}

我的理解是,const int&可以绑定到int,因为引用提供了对象的只读视图。

为什么同样的推理不适用于:

int *pi_i = &i;
const int *&rpi_i = pi_i;

是什么语言规则使这种绑定无效?如果允许这样的绑定,会带来哪些问题?

解决方案

你在这里观察到的差异与对指针的引用和对非指针的引用无关。它完全取决于在声明中相对于*的位置时,const所表示的含义。

int版本开始:

int i = 42;
const int &ri = i;

对应的指针版本是:

int *p = &i;
int * const &rp = p;   // ok

这与前面的完全不同:

const int *&rp = p;    // error

这两者是同一回事:

const int i;
int const i;

但这两者却有很大不同:

const int * p;   // non-const pointer to const int
int * const p;   // const pointer to non-const int
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章