[英]Is sizeof(int()) a legal expression?
這個問題的靈感來自Is sizeof(void())一個法律表達? 但有一個重要的區別,如下所述。
有問題的表達是:
sizeof( int() )
在C ++語法中出現:
一元表達式:
sizeof
unary-expressionsizeof (
type-id)
但是, ( int() )
可以匹配這兩種具有不同含義的情況:
int
prvalue,包含在多余的括號中 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
不能應用於函數類型。
函數式轉換和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.