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
,因为它会自动取消允许我修改值的常量。
但是第二次初始化有什么问题?我知道引用是某个东西的别名以及它是如何工作的,但仍然没有得到实际发生的事情。我想第二个错误的解释将有希望启发我第三个错误
任何人都能解释一下吗?谢谢!
答案 0 :(得分:7)
const int x = 1;
int* p;
const int*& r = p;
想象一下,我们已经走到了这一步。最后一行将给出您正在质疑的错误,但让我们假设它有效。现在r
和p
引用相同的指针对象。但现在我们可以做到这一点:
r = &x;
这会使r
指向const
对象x
,您可能认为这很好,但它也会使p
指向它。由于p
是int*
(不是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*