Is a statement void(); legal and what is it actually?

独自空忆成欢 提交于 2020-01-03 08:27:10

问题


I have a little piece of code which has a statement void();

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

What is 1 void() exactly?

  • An anonymous function declaration?
  • A type declaration?
  • An empty expression?

What makes 1 void() different from 2 void;?

I have read already:

  1. Is sizeof(void()) a legal expression? but there void() is considered a type in sizeof
  2. What does the void() in decltype(void()) mean exactly? where it is considered in declspec.
  3. And I read Is void{} legal or not?

But I am curious if the loose statement void(); is different from one of those (and why of course)


回答1:


void; is an error because there is no rule in the language grammar which matches that code. In particular, there is no rule type-id ;,

However, the code void() matches two grammar rules:

  1. type-id .
  2. postfix-expression, with the sub-case being simple-type-specifier ( expression-list-opt ).

Now, the parser needs to match void(); to a grammar rule. Even though void() matches type-id, as mentioned earlier there is no rule that would match type-id ;. So the parser rejects the possible parsing of void() as type-id in this context, and tries the other possibility.

There is a series of rules defining that postfix-expression ; makes a statement. So void() is unambiguously parsed as postfix-expression in this context.

As described by the other answers you linked already, the semantic meaning of this code as a postfix-expression is a prvalue of type void.

Related link: Is sizeof(int()) a legal expression?




回答2:


A void expression.

The compiler won't create any code for it, e.g.,

in VS

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

produces this assembly:

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


来源:https://stackoverflow.com/questions/43096571/is-a-statement-void-legal-and-what-is-it-actually

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!