2013-05-03 50 views
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 const data定義pointer to non-const data是不可能的,因爲它會自動取消允許我修改該值的常量。
但是第二次初始化有什麼問題?我知道一個參考是一個別名,它是如何工作的,但仍然沒有得到實際發生的事情。我想對第二個錯誤的解釋,希望能夠啓發我第三個錯誤。
任何人都可以點亮一下嗎?謝謝!使用非const指針定義對指向常量數據的指針的引用有什麼問題?

回答

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

想象一下,我們已經得到了這麼多。最後一行會給出您質疑的錯誤,但讓我們假設它有效。現在rp引用相同的指針對象。但是現在我們可以這樣做:

r = &x; 

這使得在const對象x,你可能會認爲是好的r點,但也會使p點吧。由於pint*(不const),我們現在可以使用p修改x

*p = 2; 

現在我們已經改變了const對象的值。有問題的錯誤阻止我們這樣做。

所以基本上,此錯誤的原因在於,能夠以指針的引用綁定到const的指針非const會給你一種方式來獲得非const指針在const對象指向。那很糟。

查看Why am I getting an error converting a Foo**Foo const** C++ FAQ瞭解相同的問題,但使用指針而不是引用。推理是一樣的。

+0

謝謝我明白了。我將其總結爲:引用必須與引用對象的類型完全相同,否則將會有一個以模糊方式定義的對象。 – 2013-05-03 23:26:44

+1

@DanielKatz它可以將「const」添加到「頂層」類型。所以你可以用'int *'初始化一個'int * const&'。 – 2013-05-03 23:30:16

+0

當我試圖向別人解釋這件事時,我總是迷惑自己,但你的解釋非常清楚。 – 2013-05-04 00:41:20

0

這是規則的另一個例子,您不能將臨時綁定到非const refence。

E.g.

X f(); 

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

您可以將指針轉換爲int的指針const int但轉換的結果是一個不同類型的新指針。您不能將右值(例如此轉換的結果)綁定到非常量引用,而只能綁定到常量引用(例如,

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