c++ - sizeof(int()) 是合法的表达式吗?

标签 c++ language-lawyer grammar

这个问题的灵感来自 Is sizeof(void()) 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 unary-expression 表格;或者是否有其他规则可以在语法匹配的早期阶段消除这两种情况的歧义。

注意。对于另一个问题 sizeof(void()),两种解释都无效,因此可以认为编译器拒绝表达式是正确的,错误消息表明它与 类型匹配- id 形式。但是,gcc 拒绝 sizeof( int() ) 并带有关于 type-id 的消息。

要清楚,我的问题是:“sizeof(int()) 是合法表达式吗?”,特别是当上述两个项目符号匹配时语法匹配如何工作的细节.

最佳答案

不,sizeof( int() ) 格式不正确,因为 int() 被视为 type-id。具体来说是函数类型,sizeof不能应用于函数类型。

[dcl.ambig.res]/2 :

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/

相关文章:

c++ - 空 vector 允许推回其自身的第一个元素

c++ - 类型检查中的纯名称等效

c++ - C++17中模板参数包的偏序规则

java - 明确指定通配符的上限时有区别吗?

parsing - 创建能够在 Prolog 中解析树的 DCG

parsing - 使用属性语法装饰解析树

c++ - "[ptr, ptr+len) must be a valid range"是什么意思?

c++使用CLI数组初始化值static int

c++ - gcc 和 clang 在使用无符号值左移时产生不同的输出

parsing - 用于先计算和后计算的工具/应用程序