使用非const指针定义对const数据的指针的引用有什么问题?

Dan*_*atz 2 c++ pointers reference

int main()
{
    const int* x;
    int* pa = x;//removes const, so UB.

    const int*& pb = pa;//error
    int* pd = pb;//error
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道pointer to non-const data用a 定义a 是不可能的pointer to const data,因为它会自动取消constness,允许我修改值.
但是第二次初始化有什么问题?我知道引用是某个东西的别名以及它是如何工作的,但仍然没有得到实际发生的事情.我想第二个错误的解释将有希望启发我第三个错误.
任何人都能解释一下吗?谢谢!

Jos*_*eld 7

const int x = 1;
int* p;
const int*& r = p;
Run Code Online (Sandbox Code Playgroud)

想象一下,我们已经走到了这一步.最后一行将给出您正在质疑的错误,但让我们假设它有效.现在r,p引用相同的指针对象.但现在我们可以这样做:

r = &x;
Run Code Online (Sandbox Code Playgroud)

这使得你可能认为很好rconst对象x,但它也会p指出它.既然pint*(不是const),我们现在可以p用来修改x:

*p = 2;
Run Code Online (Sandbox Code Playgroud)

现在我们已经改变了const对象的价值.有问题的错误阻止我们这样做.

所以基本上,这个错误的原因是能够将对const指针的引用绑定到指向非的指针const将为您提供一种方法来使非const指针指向const对象.那很糟.

请参阅为什么我在转换Foo**Foo const** C++常见问题时遇到错误,以了解相同的问题但使用指针而不是引用.理由是一样的.