这个问题的灵感来自 Is sizeof(void()) a legal expression?但有一个重要的区别,如下所述。
有问题的表达式是:
sizeof( int() )
在C++语法中出现:
unary-expression:
sizeof
unary-expressionsizeof (
type-id)
然而,( int() )
可以用不同的含义匹配这两种情况:
- 作为一个一元表达式,它是一个值初始化的
int
纯右值,用多余的括号括起来 - 作为一个type-id,它是一个没有参数返回
int
的函数的类型。
在sizeof
的语义约束中,即C++14 [expr.sizeof]/1,它解释了sizeof(
type-id的形式 )
可能不适用于函数类型。
但是我不确定违反该语义约束是否意味着 sizeof( int() )
是正确的并使用 sizeof
unary-expression 表格;或者是否有其他规则可以在语法匹配的早期阶段消除这两种情况的歧义。
注意。对于另一个问题 sizeof(void())
,两种解释都无效,因此可以认为编译器拒绝表达式是正确的,错误消息表明它与 类型匹配- id 形式。但是,gcc 拒绝 sizeof( int() )
并带有关于 type-id 的消息。
要清楚,我的问题是:“sizeof(int())
是合法表达式吗?”,特别是当上述两个项目符号匹配时语法匹配如何工作的细节.
最佳答案
不,sizeof( int() )
格式不正确,因为 int()
被视为 type-id。具体来说是函数类型,sizeof
不能应用于函数类型。
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.
给出这个确切的例子:
void foo(signed char a) { sizeof(int()); // type-id (ill-formed) sizeof(int(a)); // expression sizeof(int(unsigned(a))); // type-id (ill-formed)
关于c++ - sizeof(int()) 是合法的表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281235/