2017-10-06 26 views
0
int i = 12; 

decltype(i) x4; // type is int 

decltype((i)) x5; // type is int& 

我們從C++ fundementals知道i是lvaue了。 現在decltype(i)等於表達式i的類型,其自然是int。 現在按規格/標準(i)也是一個左值和decltype((i))也應當以某種方式檢查表達(i)這是左值和是相同i這也是左值的類型。但爲什麼標準突然需要T&類型?C++ 11:T和T&推導[行爲差異,兩者之間] decltype行爲

這很混亂。因爲如果它是decltype((i)&)那麼我同意這意味着decltypeint&會更清晰準確。我在這裏有點失落,爲什麼i(i)兩者都解析爲左值類型導致不同類型的TT&

+0

希望鏈接的重複回答你的問題。並且[這裏](https://www.reddit.com/r/cpp/comments/4z8han/decltypee_decltypee/)的另一個討論。 – songyuanyao

回答

1

參考:decltype specifier

首先,decltype實體表達不同的行爲。

1)如果參數是加括號的ID-表達命名結構結合,然後decltype產生被引用類型(在結構化綁定聲明的說明書中所描述的)。 (因爲C++ 17)

2)如果參數是加括號的ID-表達或加括號的類的成員訪問表達式,然後得到decltype由該表達式中命名的實體的類型。如果沒有這樣的實體,或者如果參數指定了一組重載函數,則該程序是格式不正確的。

3)如果參數是類型T的任何其他表達,和 - a)如表達式的值類是x值,然後decltype產生Ť& &; b)如果表達式的值類別是左值,則decl類型產生T &; b)如果表達式的值類別是左值,則decl類型產生T &; - c)如表達式的值類是prvalue,然後decltype產生T.

低於這個行:

注意如果一個對象的名稱被加括號,則處理作爲普通的左值表達,因此decltype(x)decltype((x))通常是不同的類型。

所以根據規則2,i實體,所以decltype產生的i的確切類型,這是int。根據規則3以及特別提綱(上),(i)不是實體,而是左值表達式,因此decltype產生左值參考,即int&

&(i)(i)++是有效的表達式,所以(i)是一個左)