首页 > 解决方案 > 对类型“const int *”的非 const 左值引用不能绑定到不相关类型“int *”的值

问题描述

int main(int argc, char const *argv[])
{    
   int *i;
   const int * &j = i;
}

此代码给出了错误error: non-const lvalue reference to type 'const int *' cannot bind to a value of unrelated type 'int *

但我不清楚为什么不允许这样做。我定义j为对指向常量 int 的指针的引用。因此,如果我将其设置为等于i,我不是说这j是一个引用,i并且我们不允许修改intby 指向的i内容j吗?

标签: c++pointersreference

解决方案


所以如果我设置它等于 i,我不是说 j 是 i 的引用吗?

这就是你想说的。但是 i 的类型是不兼容的,所以这是不能说的。

并且不允许我们通过j修改i指向的int?

如果你有一个指向 const 的指针,那么你就不能修改指向的 int。您可以使用j. 但是您还没有创建这样的指针。

但是,指向非 const 的指针可以转换为指向 const 的指针。但是这种转换的结果是一个右值,所以你对非常量的引用不能绑定到它。如果您使用对 const 的引用,它将延长隐式转换的临时结果的生命周期:

const int * const &j = i;

但是这个参考只是增加了不必要的混乱。最好给转换后的指针命名,而不是引用临时对象:

const int* j = i;

为什么 i 的类型不兼容?

因为语言规则是这样说的。

这只是规则吗?

这是规则(来自最新的标准草案):

给定类型“cv1 T1”和“cv2 T2”,如果 T1 与 T2 相似 ([conv.qual]),或者 T1 是 T2 的基类,则“cv1 T1”与“cv2 T2”引用相关。如果“指向 cv2 T2 的指针”类型的纯右值可以通过标准转换序列 ([conv]) 转换为“指向 cv1 T1 的指针”类型,则“cv1 T1”与“cv2 T2”引用兼容。在使用两种类型的引用兼容关系来确定引用绑定的有效性并且标准转换序列格式不正确的所有情况下,需要这种绑定的程序是格式错误的。

对“cv1 T1”类型的引用由“cv2 T2”类型的表达式初始化,如下所示:

  • 如果引用是左值引用和初始化表达式

    • 是一个左值(但不是位域),并且“cv1 T1”与“cv2 T2”是引用兼容的,或者

    • 具有类类型(即T2是类类型),其中T1与T2不引用相关,可以转换为“cv3 T3”类型的左值,其中“cv1 T1”与“cv3引用兼容” T3”92(通过枚举适用的转换函数([over.match.ref])并通过重载决议选择最佳转换函数来选择此转换),

然后引用在第一种情况下绑定到初始化表达式左值,在第二种情况下绑定到转换的左值结果(或者,在任何一种情况下,都绑定到对象的适当基类子对象)。

  • 否则,如果引用是对非 const 限定或 volatile 限定类型的左值引用,则程序格式错误。

推荐阅读