2016-09-01 148 views

回答

9

使用hyperlinked C++ grammardecltype(void())的解析是:

decltype(expression) 
decltype(assignment-expression) 
decltype(conditional-expression) 

...很多涉及操作順序步驟去這裏......

decltype(postfix-expression) 
decltype(simple-type-specifier (expression-listopt)) 
decltype(void()) 

所以void()是一種expression在這裏,特別是postfix-expression

具體地,引用第5.2.3節[expr.type.conf] 2011年ISO C++標準的第2段:

表達T(),其中T簡單型說明符類型名說明符用於非陣列的完整對象類型或(可能CV修飾)void類型,創建 指定的類型,這是值初始化(8.5的prvalue;無初始化 完成爲void()情況)。

void()所以是void類型的表達式,正如int()int類型(具有值0)的表達。顯然,一個無效的表達式沒有價值,但這裏是decltype的操作數,所以它沒有被評估。 decltype僅引用其操作數的類型,而不是其值。

decltype(void())只是一種指代void類型的詳細方式。

+2

@skypjack:參見C++ 11標準(或草稿),第5.2.3節[expr.type.conv],第2段。*簡單類型說明符*後跟空括號「創建一個prvalue of the指定的類型,它是初始值(8.5;沒有爲void()情況進行初始化)「。就像'int()'是類型爲'int'的表達式一樣,'void()'是類型爲'void'的表達式。而且由於它是'decltype'的操作數,所以沒有對它進行評估。 'decltype(void())'是引用'void'類型的一種複雜方式。 (Yakk,你可能想要擴展你的答案來解釋'void()'是如何表達的。) –

+1

@Yakk正如評論中已經提到的,擴展答案和更多細節將會有所幫助。 +1來推廣此建議。謝謝。 – skypjack

+3

我冒昧添加一個解釋'void()'的含義。請檢查我的更新是否準確。 –

4

我引用@JoachimPileborg的comment似乎正確地解釋:

我想我想通了,現在,decltype需要一個表達,而不是一個類型。 void()實際上並不是一個類型,但是一個表達式,一個C風格的類型轉換(就像int(12.34))void(void)不是一個表達式,因此它不起作用。編譯器如何解析不同的東西取決於上下文,當它期望它解析爲一個類型的類型時,它希望它將表達式解析爲一個表達式。 sizeof()(帶圓括號)首先需要一個類型,否則它被解析爲一個帶括號的表達式。

我不是在尋找積分或聲望。
無論如何,我想這是一個有趣的答案,值得爲未來的讀者提供一個專門的問題。

+0

如果你不想要代表,你可以將答案標記爲社區維基 – AndyG

+0

@skypjack點擊「編輯」,然後在文本窗口下方選中「社區維基」框 – TemplateRex

+2

void()不是C風格投。在C中,一個cast包含一個帶括號的類型名稱,後跟一個表達式,例如'(void)42'。在'void()'中,類型名稱不是括號的,它後面沒有表達式。 –

相關問題