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
{1}}到i
?
答案 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限定的类型的左值引用,则程序格式错误。