2011-11-02 53 views
0

我在看http://msdn.microsoft.com/en-us/library/szywdw8k%28VS.80%29.aspx,部分代碼對我沒有意義。爲什麼對一個不同類型的變量的常量引用可以接受?

int iVar; 
const long& LongRef3 = iVar; // OK 

爲什麼LongRef3引用iVar,即使LongRef3被聲明爲常量時它們是不同的類型?

根據該:Why does the constness of a reference affect whether it can be initialized with a variable of a different type?

「因爲它創建臨時INT其中雙轉換,和可變的引用不能結合到臨時變量,而那些常量可以」。這對我來說沒有意義。什麼是臨時int被創建?

爲什麼我要這樣做?什麼時候聲明它是有用的const int &?

是否有限制哪些類型我可以做到這一點?

編輯:爲什麼這個問題下來投票?我相信我很好地解釋了這個問題。

回答

9
int iVar; 
const long& LongRef3 = iVar; 

參考LongRef3不引用iVar,但long類型的臨時值從iVar值初始化。該代碼是有點類似這樣:

int iVar; 
const long __injected_iVar__ = iVar; 
const long& LongRef3 = __injected_iVar__; 

你可以試試看,當你做&iVar VS &LongRef3會發生什麼。

爲什麼我要這樣做?什麼時候聲明它是有用的const int &?

在這種簡單的情況下,它可能可能沒有用。但是,如果一個函數參數通過const引用取得某些東西,那麼可以使用兼容類型甚至文字作爲這樣的參數。

而且我可以使用哪種類型的限制?

僅用於兼容類型;但它也適用於用戶定義的結構和類,只要它們提供它們之間的轉換。

0

這只是一個普通C++特性的一個方面,它允許常量引用綁定到臨時對象,並且在這個過程中延長了臨時對象的生命週期。看哪:

Foo bar(); 

void f() 
{ 
    bar(); // temporary dies at the semicolon 

    const Foo & x = bar(); // temporary has its lifetime extended... 

    // ... 

} // ... and dies only here, at the end of x's lifetime 

如在別處所指出的,你原來的代碼創建一個臨時long,然後將其綁定到常量引用。

如果您不想複製或移動或依賴RVO,則可能需要延長臨時使用期限。這可能不是該語言最有用的功能之一,但是你有它。

0

「爲什麼不是const int &」?

您可能沒有一個選擇:

int foo(); // Not provided by you. 
void bar(const long&); // Not provided by you either. 

bar(foo()); // Works because the temporary long is bound. 
相關問題