int *b = new int();
const int *&a = b;
IDE將顯示「的const int*&
類型的參考無效初始化從類型int*
的表述」C++:從型的表達的類型的參考無效初始化「const int的*」「詮釋*」
我不明白。
int *b = new int();
const int *&a = b;
IDE將顯示「的const int*&
類型的參考無效初始化從類型int*
的表述」C++:從型的表達的類型的參考無效初始化「const int的*」「詮釋*」
我不明白。
不能綁定不同類型的引用;針對這種情況,他們是int *
和const int*
。
對於const int *&a = b;
,b
是int*
然後需要首先轉換爲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。
b
是指向int的指針。a
是一個指針的引用const int的。所以b
是不能分配給a
。
你可能想一個常量指針的引用爲int代替:
int *b = new int();
int *const &a = b;
的問題是,這兩種類型的
int *
和
const int *
是兩種不同的類型。因此,在右側即變量b
被轉換爲類型const int *
的rvalue
表達。
您可能不結合非恆定參考一個rvalue
。所以,你必須寫
const int * const &a = b;
的正式理由是,int*
和const int*
是不同的類型,以及轉換創建一個臨時的,你不能綁定一個非const引用到一個臨時的。
使其成爲一個常量指針的引用將工作:
const int * const &a = b;
對於激勵例子,讓我們假設這個被允許:
int* p = nullptr;
const int*& rp = p;
rp
和p
現在指的是同一個對象。
我們來做個const int
。
const int y = 1;
分配const int*
到const int*
應該是安全的,對嗎?
rp = &y;
現在,由於*p
不是常量,我們可以將新值分配給它:
*p = 0xbaad1dea;
但p
是相同的對象rp
,並*rp
是y
所以*p
也y
,y
是const
現在我們在未定義的行爲的土地。
原因是[在此解釋](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