這是this的後續問題,更準確地說是this的解答。decltype(void())中的void()是什麼意思?
decltype(void())
中的void()
代表什麼?
它代表一個函數類型,一個表達式或其他嗎?
這是this的後續問題,更準確地說是this的解答。decltype(void())中的void()是什麼意思?
decltype(void())
中的void()
代表什麼?
它代表一個函數類型,一個表達式或其他嗎?
使用hyperlinked C++ grammar的decltype(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
類型的詳細方式。
我引用@JoachimPileborg的comment似乎正確地解釋:
我想我想通了,現在,decltype需要一個表達,而不是一個類型。 void()實際上並不是一個類型,但是一個表達式,一個C風格的類型轉換(就像int(12.34))void(void)不是一個表達式,因此它不起作用。編譯器如何解析不同的東西取決於上下文,當它期望它解析爲一個類型的類型時,它希望它將表達式解析爲一個表達式。 sizeof()(帶圓括號)首先需要一個類型,否則它被解析爲一個帶括號的表達式。
我不是在尋找積分或聲望。
無論如何,我想這是一個有趣的答案,值得爲未來的讀者提供一個專門的問題。
如果你不想要代表,你可以將答案標記爲社區維基 – AndyG
@skypjack點擊「編輯」,然後在文本窗口下方選中「社區維基」框 – TemplateRex
void()不是C風格投。在C中,一個cast包含一個帶括號的類型名稱,後跟一個表達式,例如'(void)42'。在'void()'中,類型名稱不是括號的,它後面沒有表達式。 –
@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()'是如何表達的。) –
@Yakk正如評論中已經提到的,擴展答案和更多細節將會有所幫助。 +1來推廣此建議。謝謝。 – skypjack
我冒昧添加一個解釋'void()'的含義。請檢查我的更新是否準確。 –