问题
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:
- Is sizeof(void()) a legal expression? but there void() is considered a type in sizeof
- What does the void() in decltype(void()) mean exactly? where it is considered in declspec.
- 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:
type-id
.postfix-expression
, with the sub-case beingsimple-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