关于C ++:sizeof(int())是合法表达式吗?

Is sizeof(int()) a legal expression?

这个问题的灵感是sizeof(void())是合法的表达吗?但有一个重要的区别,如下所述。

有问题的表达式是:

1
sizeof( int() )

在C ++语法中,出现:

unary-expression:

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

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

  • 作为一元表达式,它是一个值初始化的int prvalue,用多余的括号括起来
  • 作为类型标识,它是没有参数返回int的函数的类型。

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

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

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

明确地说,我的问题是:" sizeof( int() )是否合法?",尤其是当上述两个项目符号都匹配时,语法匹配如何工作的细节。


不,sizeof( int() )格式错误,因为int()被视为类型标识。 具体来说,它是一种函数类型,并且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.

给出这个确切的例子:

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