对类型'const int *'的非const左值引用不能绑定到不相关的类型'int *

时间:2020-04-24 16:19:17

标签: c++ pointers reference

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,不是说ji的引用,我们不允许修改{指向的int {1}}到i

1 个答案:

答案 0 :(得分:0)

因此,如果我将其设置为等于i,不是说j是i的引用

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

,我们不允许修改i到j指向的int吗?

如果您有指向const的指针,则无法修改指向的int。您可以使用j来引用这样的指针。但是您尚未创建此类指针。

但是,指向非const的指针可以转换为指向const的指针。但是这种转换的结果是一个右值,因此您对non-const的引用不能绑定到该值。如果使用对const的引用,它将延长隐式转换的临时结果的寿命:

const int * const &j = i;

但是参考文献只是增加了不必要的困惑。最好给转换后的指针起一个名字,而不要引用一个临时对象:

const int* j = i;

为什么我的类型不兼容?

因为语言规则如此。

这只是规则吗?

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

鉴于类型“ cv1 T1”和“ cv2 T2”,如果T1与T2类似([conv.qual]),或者T1是T2的基类,则“ cv1 T1”与“ cv2 T2”相关。 。 如果可以通过标准转换序列([conv])将“指向cv2 T2的指针”的prvalue转换为“指向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限定的类型的左值引用,则程序格式错误。