【发布时间】:2016-09-01 21:35:16
【问题描述】:
这个问题的灵感来自Is sizeof(void()) a legal expression?,但有一个重要的区别,如下所述。
有问题的表达式是:
sizeof( int() )
在C++语法中出现:
一元表达式:
sizeof一元表达式sizeof (type-id)
不过,( int() ) 可以用不同的含义匹配这两种情况:
- 作为一元表达式,它是一个值初始化的
intprvalue,用多余的括号括起来 - 作为一个type-id,它是一个没有参数返回
int的函数的类型。
在sizeof的语义约束中,即C++14 [expr.sizeof]/1,它解释了sizeof(的形式 type-id )可能不适用到一个函数类型。
但是我不确定违反该语义约束是否意味着sizeof( int() ) 是正确的并使用sizeof unary-expression 形式;或者是否有其他规则可以在语法匹配的早期阶段消除这两种情况的歧义。
注意。对于另一个问题sizeof(void()),两种解释都无效,因此可以认为编译器拒绝该表达式是正确的,错误消息表明它与 type-id 形式匹配。然而,gcc 拒绝 sizeof( int() ) 并带有关于 type-id 的消息。
明确地说,我的问题是:“sizeof( int() ) 是一个合法的表达式吗?”,特别是在上述两个项目符号匹配时语法匹配如何工作的细节。
【问题讨论】:
-
当然,无论
sizeof(int())是什么意思打算,肯定有更清晰的表达方式——很可能是sizeof (int)。 (是的,这是一个语言律师问题,所以这不是问题,我只是想提一下。) -
@skypjack 请阅读我的问题的第一段
-
我已经完整地阅读了它。我同意它们都不应该被关闭。我正在投票重新打开这个。
标签: c++ language-lawyer grammar