【问题标题】:Is sizeof(int()) a legal expression?sizeof(int()) 是合法的表达式吗?
【发布时间】:2016-09-01 21:35:16
【问题描述】:

这个问题的灵感来自Is sizeof(void()) a legal expression?,但有一个重要的区别,如下所述。

有问题的表达式是:

sizeof( int() )

在C++语法中出现:

一元表达式:

  • sizeof 一元表达式
  • sizeof ( type-id )

不过,( int() ) 可以用不同的含义匹配这两种情况:

  • 作为一元表达式,它是一个值初始化的int prvalue,用多余的括号括起来
  • 作为一个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


【解决方案1】:

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

[dcl.ambig.res]/2:

歧义可能源于函数样式之间的相似性 cast 和一个 type-id。决议是任何可以 在其句法上下文中可能是一个 type-id 应被视为 类型 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() ) 是不合法的(因为sizeof 不能应用于函数类型)。
  • 这是一个有趣的问题和答案。类型 int() 不能与 sizeof 一起使用,即使它可以很容易地分配给 int(*)() 而无需强制转换(大概可以与 sizeof 一起使用)。
  • @KlitosKyriacou:int(*)() 是指针类型。这样的赋值在没有强制转换的情况下是合法的,因为函数类型的表达式(在大多数情况下)被隐式转换为指针。
猜你喜欢
  • 2017-01-09
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多