这个问题的灵感来自Is sizeof(void()) a legal expression?,但有一个重要的区别,如下所述。
有问题的表达是:
sizeof( int() )
在C ++语法中出现:
一元表达式:
sizeof
一元表达sizeof (
type-id)
但是,( int() )
可以使用不同的含义匹配这两种情况:
int
prvalue,用多余的括号括起来int
的函数的类型。在sizeof
的语义约束中,即C ++ 14 [expr.sizeof] / 1,它解释了形式sizeof(
type-id {{1可能不适用于函数类型。
但是我不确定违反该语义约束是否意味着)
是正确的并且使用sizeof( int() )
一元表达式形式;或者是否有其他规则在语法匹配的早期阶段消除两个案例的歧义。
NB。对于另一个问题sizeof
,两种解释都不是有效的,因此可以认为编译器拒绝表达式时出现错误消息表明它与 type-id 形式匹配是正确的。但是,gcc拒绝sizeof(void())
并提供有关 type-id 的消息。
要明确的是,我的问题是:“sizeof( int() )
是一个合法表达吗?”,尤其是当上述两个项目符号都匹配时语法匹配如何工作的详细信息。
答案 0 :(得分:22)
不,sizeof( int() )
格式错误,因为int()
被视为 type-id 。具体来说,它是一个函数类型,sizeof
不能应用于函数类型。
函数式之间的相似性可能会产生歧义 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)