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

时间:2016-09-01 21:35:17

标签: c++ language-lawyer grammar

这个问题的灵感来自Is sizeof(void()) a legal expression?,但有一个重要的区别,如下所述。

有问题的表达是:

sizeof( int() )

在C ++语法中出现:

  

一元表达式:

     
      
  • sizeof 一元表达
  •   
  • sizeof ( type-id )
  •   

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

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

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

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

NB。对于另一个问题sizeof,两种解释都不是有效的,因此可以认为编译器拒绝表达式时出现错误消息表明它与 type-id 形式匹配是正确的。但是,gcc拒绝sizeof(void())并提供有关 type-id 的消息。

要明确的是,我的问题是:“sizeof( int() )是一个合法表达吗?”,尤其是当上述两个项目符号都匹配时语法匹配如何工作的详细信息。

1 个答案:

答案 0 :(得分:22)

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

[dcl.ambig.res]/2

  

函数式之间的相似性可能会产生歧义   cast和 type-id 。决议是任何可能的结构   可能是句法上下文中的 type-id 应被视为a   型-ID

给出了这个确切的例子:

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