簡體   English   中英

對類型“const int *”的非 const 左值引用不能綁定到不相關類型“int *”的值

[英]non-const lvalue reference to type 'const int *' cannot bind to a value of unrelated type 'int *

int main(int argc, char const *argv[])
{    
   int *i;
   const int * &j = i;
}

此代碼給出錯誤error: non-const lvalue reference to type 'const int *' cannot bind to a value of unrelated type 'int *

但我不清楚為什么不允許這樣做。 我將j定義為對指向常量 int 的指針的引用。 因此,如果我將它設置為等於i ,我不是說ji的引用並且我們不允許通過j修改i指向的int嗎?

所以如果我將它設置為等於 i,我不是說 j 是 i 的引用嗎?

這就是你想說的。 但是 i 的類型不兼容,所以這是不能說的。

而且我們不允許通過j修改i指向的int?

如果你有一個指向 const 的指針,那么你就不能修改指向的 int。 你可以用j引用這樣的指針。 但是你還沒有創建這樣的指針。

但是,指向非常量的指針可以轉換為指向 const 的指針。 但是這種轉換的結果是一個右值,所以你對非常量的引用不能綁定到它。 如果您使用對 const 的引用,它會延長隱式轉換的臨時結果的生命周期:

const int * const &j = i;

但是參考只是增加了不必要的融合。 最好給轉換后的指針一個名字,而不是引用一個臨時的 object:

const int* j = i;

為什么我的類型不兼容?

因為語言規則是這么說的。

這只是規則嗎?

這是規則(來自最新的標准草案):

給定類型“cv1 T1”和“cv2 T2”,如果 T1 與 T2 相似([conv.qual]),或者 T1 是 T2 的基數 class,則“cv1 T1”與“cv2 T2”相關。 如果“指向 cv2 T2 的指針”類型的純右值可以通過標准轉換序列 ([conv]) 轉換為“指向 cv1 T1 的指針”類型,則“cv1 T1”與“cv2 T2”引用兼容。 在兩種類型的引用兼容關系用於建立引用綁定的有效性並且標准轉換序列格式錯誤的所有情況下,需要這種綁定的程序格式錯誤。

對類型“cv1 T1”的引用由類型“cv2 T2”的表達式初始化,如下所示:

  • 如果引用是左值引用且初始化表達式

    • 是左值(但不是位域),並且“cv1 T1”與“cv2 T2”引用兼容,或者

    • 有一個 class 類型(即,T2 是一個 class 類型),其中 T1 與 T2 沒有引用相關,並且可以轉換為類型“cv3 T3”的左值,其中“cv1 T1”與“cv3”引用兼容T3”92(此轉換是通過枚舉適用的轉換函數([over.match.ref])並通過重載決議選擇最佳函數來選擇的),

然后引用在第一種情況下綁定到初始化表達式左值,在第二種情況下綁定到轉換的左值結果(或者,在任何一種情況下,都綁定到對象的適當基類 class 子對象)。

  • 否則,如果引用是對非 const 限定或 volatile 限定的類型的左值引用,則程序格式錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM