2011-09-13 175 views
8

在下面,會在const引用被用於非const對象之前創建一個臨時對象嗎?對非const對象的const引用

const int y = 2000; 
const int &s = y // ok, const reference to const object. 

int x = 1000; 
const int &r = x; // any temporary copy here? 

如果沒有,那麼這是如何工作的?

const int z = 3000; 
    int &t = z // ok, why can't you do this? 

回答

13

的引用僅僅是用於現有對象的別名。 const由編譯器強制執行;它只是檢查你是否試圖通過參考r修改對象。 *這不需要創建副本。

鑑於const僅僅是編譯器的指令爲「只讀」執行,那麼它應該是立即顯而易見的,爲什麼你的最後一個例子不能編譯。 const將是毫無意義的,如果你可以通過對const對象採取非const引用輕鬆規避它。

*當然,您仍然可以通過x修改對象。任何更改也將通過r可見,因爲它們指的是同一個對象。

+1

尤其是第一種情況下,r'的'值可以改變,即使它被聲明'const'。 – avakar

+0

通常,編譯器通過一個簡單的指針來實現引用。 –

+1

@quant_dev給出OP的示例,提到'x'的源代碼和提到'r'的源代碼被編譯爲相同的機器代碼。沒有涉及指針(在我見過的所有編譯器上)。不是說它是相關的。 – Cubbi

5

int x = 1000; 
const int &r = x; 

右手側爲左值x類型是一樣的參考(忽略CV-資格)的類型。在這種情況下,該參考文件直接附於x,不會創建臨時文件。

至於「這項工作如何」......我不明白是什麼引發了你的問題。它只是以最直接的方式工作:參考直接附於x。沒有更多的了。

你不能這樣做

const int z = 3000; 
int &t = z; 

,因爲它違反了立即常量,正確的規則。

+2

+1用於回答這兩個部分 – Lou

1

的參考理解(&)回答了這個問題..

參考只是一個別名,它被分配給它的變量..

和const是由編譯器所施加的限制到聲明爲const的變量

int x = 1000; 
const int &r = x; 

在這種情況下,它是對非常量變量的const引用。所以不能參考變量r改變x的數據(只是僅作用一個讀)..但仍可以通過修改X

const int z = 3000; 
int &t = z 

在這種情況下,非常量引用常量成員改變數據x其中沒有意義。你說引用可以讓你編輯一個const成員(這是永遠不可能的)..

所以,如果你想創建一個const成員的引用,它必須是像你提到

const int z = 3000; 
const int &t = z;