簡體   English   中英

void()和int()解析之間的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM