2017-01-26 31 views
2
int *b = new int(); 
const int *&a = b; 

IDE將顯示「的const int*&類型的參考無效初始化從類型int*的表述」C++:從型的表達的類型的參考無效初始化「const int的*」「詮釋*」

我不明白。

+1

原因是[在此解釋](http://c-faq.com/ansi/constmismatch.html)指針方面。考慮以下內容:'const int i = 0; int * p; const int *&z =&p; z =&i;' - 'p'不能指向'i'。然而,如果允許這種轉換,那麼你可以通過引用來改變'p',指向'i'並使用它來改變'i'。 – chris

回答

2

不能綁定不同類型的引用;針對這種情況,他們是int *const int*

對於const int *&a = b;,bint*然後需要首先轉換爲const int*。隱式轉換在這裏允許的,但轉化const int*是暫時的,不能被綁定到a;因爲它是對非const的左值引用。

在另一方面,temporary object可以綁定到左值參考const或右值引用的,即

const int * const &a = b; // fine, and the lifetime of the temporary is extended to match the lifetime of the reference a 

const的位置,現在a被聲明爲一個左值-參考常量指針const int。

2
  • b是指向int的指針
  • a是一個指針的引用const int的

所以b是不能分配給a

你可能想一個常量指針的引用爲int代替:

int *b = new int(); 
int *const &a = b; 
0

的問題是,這兩種類型的

int * 

const int * 

是兩種不同的類型。因此,在右側即變量b被轉換爲類型const int *rvalue表達。

您可能不結合非恆定參考一個rvalue。所以,你必須寫

const int * const &a = b; 
0

的正式理由是,int*const int*是不同的類型,以及轉換創建一個臨時的,你不能綁定一個非const引用到一個臨時的。

使其成爲一個常量指針的引用將工作:

const int * const &a = b; 

對於激勵例子,讓我們假設這個被允許:

int* p = nullptr; 
const int*& rp = p; 

rpp現在指的是同一個對象。

我們來做個const int

const int y = 1; 

分配const int*const int*應該是安全的,對嗎?

rp = &y;   

現在,由於*p不是常量,我們可以將新值分配給它:

*p = 0xbaad1dea; 

p是相同的對象rp,並*rpy所以*pyyconst

現在我們在未定義的行爲的土地。

相關問題