sizeof(int()) 是一个合法的表达式吗?
Is sizeof(int()) a legal expression?
这个问题的灵感来自 ,但有一个重要的区别,如下所述。
有问题的表达式是:
sizeof( int() )
在C++语法中出现:
unary-expression:
sizeof
unary-expression
sizeof (
type-id )
然而,( int() )
可以匹配这两种情况,具有不同的含义:
- 作为一个一元表达式,它是一个值初始化的
int
纯右值,被多余的括号包围
- 作为type-id,它是一个没有参数返回的函数类型
int
。
在 sizeof
的语义约束中,即 C++14 [expr.sizeof]/1,它解释了形式 sizeof(
type-id )
可能不适用于函数类型。
但是我不确定违反该语义约束是否意味着 sizeof( int() )
是正确的并使用 sizeof
一元表达式 形式;或者是否有其他一些规则可以在语法匹配的早期阶段消除这两种情况的歧义。
注意。对于另一个问题 sizeof(void())
,这两种解释都无效,因此可以说编译器拒绝表达式是正确的,错误消息表明它与 type-id 匹配形式。但是,gcc 拒绝 sizeof( int() )
并显示一条关于 type-id.
的消息
明确地说,我的问题是:"Is sizeof( int() )
a legal expression?",特别是关于当上述两种情况都匹配时语法匹配如何工作的细节。
不,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)
这个问题的灵感来自
有问题的表达式是:
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
一元表达式 形式;或者是否有其他一些规则可以在语法匹配的早期阶段消除这两种情况的歧义。
注意。对于另一个问题 sizeof(void())
,这两种解释都无效,因此可以说编译器拒绝表达式是正确的,错误消息表明它与 type-id 匹配形式。但是,gcc 拒绝 sizeof( int() )
并显示一条关于 type-id.
明确地说,我的问题是:"Is sizeof( int() )
a legal expression?",特别是关于当上述两种情况都匹配时语法匹配如何工作的细节。
不,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)