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

有问题的表达式是:

sizeof( int() )

在C++语法中,出现:



但是,( 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()被视为类型ID。具体来说,它是一种函数类型,并且sizeof无法应用于函数类型。

    [dcl.ambig.res]/2:



    给出这个确切的例子:

    关于c++ - sizeof(int())是合法表达式吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39281235/

    10-11 23:27
    查看更多