是一个声明void();合法的,实际上是什么?

时间:2017-03-29 14:33:53

标签: c++ language-lawyer

我有一段代码,其中有一条声明void();

int main() 
{
   void( ); // 1: parses fine in GCC 5.4.0 -Wpedantic 
   // void;    // 2: error declaration does not declare anything
} 

1 void()究竟是什么?

  • 匿名函数声明?
  • 类型声明?
  • 空表达?

1 void()与2 void;的区别是什么?

我已经读过了:

  1. Is sizeof(void()) a legal expression?但是void()被认为是sizeof
  2. 中的一个类型
  3. What does the void() in decltype(void()) mean exactly?在declspec中考虑。
  4. 我读了Is void{} legal or not?
  5. 但我很好奇松散语句void();不同于其中之一(当然为什么)

2 个答案:

答案 0 :(得分:4)

void;是一个错误,因为语言语法中没有与该代码匹配的规则。特别是,没有规则 type-id ;

但是,代码void()匹配两个语法规则:

  1. type-id
  2. postfix-expression ,子案例为 simple-type-specifier ( expression-list-opt )
  3. 现在,解析器需要将void();与语法规则匹配。即使void() type-id 匹配,如前所述,也没有符合 type-id ;的规则。因此,解析器拒绝在此上下文中将void()解析为 type-id ,并尝试另一种可能性。

    一系列规则,用于定义 postfix-expression ;生成语句。因此,void()在此上下文中被明确地解析为 postfix-expression

    正如您已经链接的其他答案所述,此代码作为后缀表达式的语义含义是void类型的prvalue。

    相关链接:Is sizeof(int()) a legal expression?

答案 1 :(得分:0)

void表达式。

编译器不会为它创建任何代码,例如,

VS中的

_asm
{
    nop;
}
void();
_asm
{
    nop;
}

生成这个程序集:

_asm
{
    nop;
003017CE  nop  
}
void();
_asm
{
    nop;
003017CF  nop  
}