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

Is sizeof(int()) a legal expression?

这个问题的灵感来自 ,但有一个重要的区别,如下所述。

有问题的表达式是:

sizeof( int() )

在C++语法中出现:

unary-expression:

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

然而,( int() ) 可以匹配这两种情况,具有不同的含义:

sizeof 的语义约束中,即 C++14 [expr.sizeof]/1,它解释了形式 sizeof( type-id ) 可能不适用于函数类型。

但是我不确定违反该语义约束是否意味着 sizeof( int() ) 是正确的并使用 sizeof 一元表达式 形式;或者是否有其他一些规则可以在语法匹配的早期阶段消除这两种情况的歧义。

注意。对于另一个问题 sizeof(void()),这两种解释都无效,因此可以说编译器拒绝表达式是正确的,错误消息表明它与 type-id 匹配形式。但是,gcc 拒绝 sizeof( int() ) 并显示一条关于 type-id.

的消息

明确地说,我的问题是:"Is sizeof( int() ) a legal expression?",特别是关于当上述两种情况都匹配时语法匹配如何工作的细节。

不,sizeof( int() ) 格式错误,因为 int() 被认为是 type-id。具体来说是函数类型,sizeof不能应用于函数类型

[dcl.ambig.res]/2:

An ambiguity can arise from the similarity between a function-style cast and a type-id. The resolution is that any construct that could possibly be a type-id in its syntactic context shall be considered a 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)