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

时间:2013-05-03 22:53:44

标签: 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;
}

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

2 个答案:

答案 0 :(得分:7)

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

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

r = &x;

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

*p = 2;

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

所以基本上,这个错误的原因是能够将对const指针的引用绑定到指向非const的指针,这将为您提供获取非{{{}的方法。 1}}指向const对象的指针。那很糟糕。

请参阅Why am I getting an error converting a Foo**Foo const** C ++常见问题解答以了解相同的问题但使用指针而不是引用。理由是一样的。

答案 1 :(得分:0)

这只是规则的另一个实例,你不能将临时绑定到非const refence。

E.g。

X f();

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

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

const int* const& pb = pa; // pb is not bound directly to pa but to
                           // the result of converting pa to const int*