[英]Difference between parsing of void() and int()
閱讀了最令人頭疼的解析之后,我做了一些實驗,找到了這個程序。 有兩條非常相似的線。 其中一個在g ++ 7和clang ++-3.9中都發出警告,而另一個則不。
int main() {
void(); // no warning
int(); // warning: statement has no effect
}
在第二行中,創建了一個類型為int
的默認構造的對象,並立即將其銷毀,因此未使用。 但是第一行會發生什么? 如果以相同的方式進行解析,則應該是錯誤的,因為創建void
類型的對象是非法的。 另一方面,它看起來也不像是一個函數聲明。
解析沒有區別。 兩種情況都由simple-type-specifier和可選的帶括號的expression-list覆蓋。
語義含義在C ++ 17(N4659)[expr.type.conv] / 2中指定:
如果類型為cv
void
且初始值設定項為()
,則表達式為不執行初始化的指定類型的prvalue。 否則,表達式是指定類型的prvalue,其結果對象使用初始化程序直接初始化。
這特別表明void()
是void
類型的prvalue。
現在,我確定不打算將void類型的prvalue視為非法,因為這是常見的情況,例如(void)x;
或調用void函數!
但是我找不到標准中的哪個地方說應該針對void
prvalue抑制臨時物化。 [class.temporary] / 2似乎說一個廢棄值表達式總是實現一個臨時值。 而實現不完整類型的prvalue是錯誤的。 也許這是標准中的缺陷。
關於“未使用的值”的警告的不同可能是因為void
類型的未使用的值是常見的情況,因此不會產生警告。
它的解析方式相同。
警告不是來自解析器。 它們在語義分析過程中出現。 SA注意到一個值被int();
銷毀了int();
不會被讀取或寫入。
在void
情況下,沒有任何價值,因此沒有警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.