const引用可以用不同類型的對象初始化(只要能從一種類型轉換到另一種類型即可),也可以是不可尋址的值,如文字常量,例如:
同樣的初始化對於非const引用是不合法的,將導致編譯錯誤。原因如下。
引用在內部存放的是一個對象的地址,它是該對象的別名。對於不可尋址的值,如文字常量,以及不同類型的對象,編譯器爲了實現引用,必須生成一個臨時對象,引用實際上指向該對象,但用戶不能訪問它。例如,當我們寫:
編譯器將其轉換成:
如果我們給ri賦一個新值,則這樣做不會改變dval,而是改變temp。對用戶來說,就好像修改動作沒有生效。
const引用不會暴露這個問題,因爲它們是隻讀的。不允許非const引用指向需要臨時對象的對象或值,一般來說,這比“允許定義這樣的引用,但實際上不會生效”的方案要好。
下面給出的例子很難在第一次就能正確聲明。我們希望用一個const對象的地址來初始化一個引用。非const引用定義是非法的,將導致編譯時刻錯誤:
下面是在打算修正pi_ref定義時首先想到的做法,但是該定義不能生效。
如果從右向左讀這個定義,會發現pi_ref是指向一個定義爲const的int型對象的指針,我們的引用不是指向一個常量,而是指向一個非常量指針,指針指向一個const對象。
正確的定義如下:
指針和引用有兩個主要區別:引用必須總是指向一個對象。如果用一個引用給另一個引用賦值,那麼改變的是被引用的對象而不是引用本身。