Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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)

like image 345
André Avatar asked Mar 29 '17 14:03

André


People also ask

Is void legal?

Having no legal effect from the start. Thus, a void contract is invalid from the start of its purported closing (having no legal effect, it does not change the legal relationship between the parties involved).

Is a void contract valid?

A void contract is a contract that isn't legally enforceable, starting from the time it was created. While both a void and voidable contract are null, a void contract cannot be ratified. In a legal sense, a void contract is treated as if it was never created and becomes unenforceable in court.

What is considered a void?

Something that is void is officially considered to have no value or authority. The vote was declared void.

What is void and valid?

Void: Not an actual contract and is unenforceable. Valid: Legally binding and enforceable in a court of law.


1 Answers

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?

like image 105
M.M Avatar answered Oct 27 '22 07:10

M.M