Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';用非常量指针定义指向常量数据的指针的引用有什么错?_C++_Pointers_Reference - Fatal编程技术网

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**
不是-a
int**
,因为对受限子类型的写入与从受限子类型读取不同。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*