这个问题的灵感来源于Is sizeof(void()) a legal 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() )
在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