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

    const int*& pb = pa;//error
    int* pd = pb;//error
    return 0;
}

pointer to non-const data我知道用 a定义 a 是不可能的pointer to const data,因为它会自动取消常量,允许我修改值。
但是第二次初始化有什么问题呢?我知道引用是某事的别名以及它是如何工作的,但仍然根本不知道那里实际发生了什么。我想对第二个错误的解释有望启发我第三个错误。
任何人都可以解释一下吗?谢谢!

4

2 回答 2

7
const int x = 1;
int* p;
const int*& r = p;

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

r = &x;

r指向constobject x,您可能认为这很好,但它也会p指向它。由于pint*(not const),我们现在可以使用p来修改x

*p = 2;

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

所以基本上,这个错误的原因是能够将指向指针的引用绑定到指向const非的指针const会给你一种方法来让非const指针指向一个const对象。那很糟。

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

于 2013-05-03T23:03:04.757 回答
0

这只是您不能将临时值绑定到非常量引用的规则的另一个实例。

例如

X f();

X& r = f(); // illegal
X const& cr = f(); // OK

您可以将指向指针转换为指向int指针,const int但该转换的结果是具有不同类型的新指针。您不能将右值(例如此转换的结果)绑定到非常量引用,只能绑定到 const 引用,例如

const int* const& pb = pa; // pb is not bound directly to pa but to
                           // the result of converting pa to const int*
于 2013-05-04T00:38:21.623 回答