非const lvalue的'const int *'类型的引用不能绑定到一个无关的'int *'类型的值。

问题描述 投票:0回答:2
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 而我们是不允许修改 int 所指 i 通过 j?

c++ pointers reference
2个回答
0
投票

所以如果我把它设为等于i,是不是说j是i的一个引用

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

而我们是不允许通过j来修改i所指向的int的?

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

然而,指向non-const的指针可以转换为指向const的指针,但这种转换的结果是一个r值,所以你对non-const的引用不能绑定到它。但是这种转换的结果是一个r值,所以你对non-const的引用不能绑定到它。如果你使用对const的引用,它会延长隐式转换的临时结果的寿命。

const int * const &j = i;

但这个引用只是增加了不必要的合并。最好给转换后的指针一个名字,而不是引用一个临时对象。

const int* j = i;

为什么i的类型不兼容?

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

这只是规则吗?

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

给定类型 "cv1 T1 "和 "cv2 T2", "cv1 T1 "与 "cv2 T2 "是引用相关的,如果T1与T2相似([conv. qual]), 或者T1是T2的基类. "cv1 T1 "与 "cv2 T2 "是引用相关的,如果 "指向cv2 T2的指针 "类型的pr值可以通过标准转换序列([conv])转换为 "指向cv1 T1的指针 "类型。 在所有的情况下,两个类型的引用兼容关系被用来建立引用绑定的有效性,而标准转换序列将是错误的,一个需要这种绑定的程序是错误的。

类型为 "cv1 T1 "的引用被类型为 "cv2 T2 "的表达式初始化,如下所示。

  • 如果这个引用是一个l值引用,并且初始化表达式是

    • 是一个l值(但不是位域),"cv1 T1 "与 "cv2 T2 "是参考兼容的,或者是

    • 有一个类类型(即T2是一个类类型),其中T1与T2没有引用关系,可以转换为类型为 "cv3 T3 "的l值,其中 "cv1 T1 "与 "cv3 T3"92具有引用兼容性(这种转换是通过列举适用的转换函数([over.match.ref])来选择的,并通过过载解析选择最好的一个)。

那么在第一种情况下,引用会被绑定到初始化表达式lvalue上,在第二种情况下,会被绑定到转换的lvalue结果上(或者,在这两种情况下,都会被绑定到对象的相应基类子对象上)。

  • 否则,如果引用是对一个非const-限定的类型的lvalue引用,或者是volatile限定的类型,则程序是不合格的。
© www.soinside.com 2019 - 2024. All rights reserved.