为什么对指针的引用在行为上与对非指针的引用不同?
我在试着理解,为什么对一个指针的引用与对一个非指针的引用的行为会不同。
下面的程序在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。