sizeof(int())是一个合法的表达式吗?

20
这个问题的灵感来源于Is sizeof(void()) a legal expression?,但有一个重要的区别,如下所述。
表达式是:
sizeof( int() )
在C ++语法中,出现以下内容: unary-expression:
sizeof unary-expression
sizeof(type-id)
然而,(int())可以匹配这两种情况,具有不同的含义:
作为一种一元表达式,它是一个值初始化的int prvalue,被多余的括号包围
作为type-id,它是一个没有返回值的不带参数的函数的类型。
在sizeof的语义约束中,即C++14 [expr.sizeof] / 1中,它解释了形式sizeof(type-id)不能应用于函数类型。
然而,我不确定违反那个语义约束是否意味着sizeof(int())正确并使用sizeof unary-expression形式。 或者是否有其他规则在较早的语法匹配阶段消歧两种情况。
请注意,对于另一个问题sizeof(void ()),两种解释都无效,因此可以认为编译器正确地拒绝了指示它匹配了type-id形式的错误消息的表达式。 然而,gcc用关于type-id的消息拒绝了sizeof(int())。
明确我的问题是:“sizeof(int())是合法表达式吗?”,特别是关于当上述两个项目都匹配时语法匹配如何工作的细节。

当然,无论sizeof(int()) 意味着什么,肯定有一种更清晰的表达方式--很可能是 sizeof(int)。 (是的,这是一个钻牛角尖的问题,所以没有问题,我只是想提一下。) - Keith Thompson
@skypjack,请先阅读我的问题的第一段。 - M.M
我已经全文阅读了。我同意它们中没有一个应该关闭。我投票重新开放这个。 - skypjack
1个回答

22
不,sizeof(int())是不合法的,因为int()被认为是一个类型标识符。具体来说,它是一个函数类型,而sizeof不能应用于函数类型。
根据[dcl.ambig.res]/2

由于函数样式转换和类型标识符之间的相似性可能会导致歧义。解决方法是,在其语法上下文中可能是类型标识符的任何构造都应被视为类型标识符

给出了这个确切的例子:
void foo(signed char a) {
    sizeof(int());                // type-id (ill-formed)
    sizeof(int(a));               // expression
    sizeof(int(unsigned(a)));     // type-id (ill-formed)

3
这是一个很好的回答——只不过有个小细节,它实际上并没有回答这个问题。你可能需要提到,不,sizeof(int())是不合法的(因为sizeof不能应用于函数类型)。 - Keith Thompson
这是一个有趣的问题和答案。尽管int()可以轻松赋值给int(*)()(无需强制转换),但其不能与sizeof一起使用。 - Klitos Kyriacou
@KlitosKyriacou:int(*)()是一个指针类型。这样的赋值在没有强制转换的情况下是合法的,因为函数类型的表达式(在大多数情况下)会被隐式转换为指针。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接