C++ 什么';用非常量指针定义指向常量数据的指针的引用有什么错?
我知道不能用指向常量数据的C++ 什么';用非常量指针定义指向常量数据的指针的引用有什么错?,c++,pointers,reference,C++,Pointers,Reference,我知道不能用指向常量数据的指针定义指向非常量数据的指针,因为它会自动取消常量,允许我修改值。 但第二次初始化有什么问题?我知道引用是某物的别名,以及它是如何工作的,但我仍然不知道那里到底发生了什么。我想对第二个错误的解释,希望能启发我第三个错误。 有人能解释一下吗?谢谢 int main() { const int* x; int* pa = x;//removes const, so UB. const int*& pb = pa;//error in
指针定义指向非常量数据的指针,因为它会自动取消常量,允许我修改值。
但第二次初始化有什么问题?我知道引用是某物的别名,以及它是如何工作的,但我仍然不知道那里到底发生了什么。我想对第二个错误的解释,希望能启发我第三个错误。
有人能解释一下吗?谢谢
int main()
{
const int* x;
int* pa = x;//removes const, so UB.
const int*& pb = pa;//error
int* pd = pb;//error
return 0;
}
想象一下我们已经走了这么远。这最后一行将给出您所质疑的错误,但让我们假设它是有效的。现在r
和p
引用相同的指针对象。但现在我们可以做到这一点:
const int x = 1;
int* p;
const int*& r = p;
这使得r
指向const
对象x
,您可能认为这很好,但也会使p
指向它。由于p
是int*
(不是const
),我们现在可以使用p
修改x
:
r = &x;
现在我们已经更改了const
对象的值。所讨论的错误阻止我们这样做
因此,基本上,这个错误的原因是,如果能够将指向const
的指针的引用绑定到指向non-const
的指针,就可以让non-const
指针指向const
对象。那太糟糕了
<> P>参见C++ FAQ,以了解同一问题,但用指针代替引用。推理是一样的。这只是规则的另一个实例,不能将临时引用绑定到非常量引用
例如
您可以将指向int
的指针转换为指向const int
的指针,但该转换的结果是一个具有不同类型的新指针。不能将右值(例如此转换的结果)绑定到非常量引用,只能绑定到常量引用,例如
X f();
X& r = f(); // illegal
X const& cr = f(); // OK
谢谢,我知道了。我总结如下:引用必须与被引用对象的类型完全相同,否则将有一个对象以不明确的方式定义。@DanielKatz它可以向“顶级”类型添加const
。所以你可以用int*
初始化一个int*const&
。当我试图向其他人解释这一点时,我总是感到困惑,但你的解释非常清楚。这就是方形矩形OO的问题。一个典型的糟糕OO设计是“Square
s是Rectangl
e”的子类。但事实并非如此,因为Rect.SetWidth(7);垂直高度(9);断言(63==Rect.GetArea())
对于每个矩形都为真,但对于正方形则不为真ReadOnlySquare
s是ReadOnlyRectangle
s的子类。这里也发生了同样的事情——对int-const**
的只读访问与对int**
的只读访问相同,但是int-const**
不是-aint**
,因为对受限子类型的写入与从受限子类型读取不同。C#的输入/输出类型在这里会很有用。我不确定我是否真的同意这种解释int*
和const int*
与引用无关,因此如果您“走了这么远,r
将绑定到将p
转换为const int*
的结果-另一个对象<代码>r=&x
不会影响p
(仅转换副本),因此*p=2
仍将取消对未初始化的p
的引用。
X f();
X& r = f(); // illegal
X const& cr = f(); // OK
const int* const& pb = pa; // pb is not bound directly to pa but to
// the result of converting pa to const int*