簡體   English   中英

sizeof(int())是一個合法的表達式嗎?

[英]Is sizeof(int()) a legal expression?

這個問題的靈感來自Is sizeof(void())一個法律表達? 但有一個重要的區別,如下所述。

有問題的表達是:

sizeof( int() )

在C ++語法中出現:

一元表達式:

  • sizeof unary-expression
  • sizeof ( type-id )

但是, ( int() )可以匹配這兩種具有不同含義的情況:

  • 作為一元表達式 ,它是一個值初始化的int prvalue,包含在多余的括號中
  • 作為type-id ,它是沒有返回int參數的函數類型。

sizeof的語義約束中,即C ++ 14 [expr.sizeof] / 1,它解釋了表單sizeof( type-id )可能不適用於函數類型。

但是我不確定違反該語義約束是否意味着sizeof( int() )是正確的並且使用sizeof 一元表達形式; 或者是否有其他規則在語法匹配的早期階段消除兩個案例的歧義。

NB。 對於另一個問題sizeof(void()) ,這兩種解釋都不是有效的,因此可以認為編譯器拒絕表達式是錯誤的,表明它與type-id形式匹配。 但是,gcc使用有關type-id的消息拒絕sizeof( int() )

為了清楚起見,我的問題是:“ sizeof( int() )是一個合法的表達式嗎?”,尤其是當上述兩個項目符號都匹配時語法匹配如何工作的細節。

不, sizeof( int() )格式錯誤,因為int()被認為是type-id 具體來說,它是一個函數類型,而sizeof不能應用於函數類型。

[dcl.ambig.res] / 2

函數式轉換和type-id之間的相似性可能會產生歧義。 解決方案是任何可能在其語法上下文中都是type-id的構造都應被視為type-id

給出這個確切的例子:

 void foo(signed char a) { sizeof(int()); // type-id (ill-formed) sizeof(int(a)); // expression sizeof(int(unsigned(a))); // type-id (ill-formed) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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