void()与int()的解析差异疑问——涉及most vexing parse
Awesome question—this gets into some tricky corners of C++ syntax and type rules, especially when paired with the Most Vexing Parse (MVP) you mentioned. Let's break this down clearly:
Breaking Down
int() vs void() in Your Code First, a quick recap of the MVP core rule: when the compiler encounters code that could be read as either an object creation expression or a function declaration, it will always prioritize the function declaration. But in your two lines of code, this rule plays out differently because of the unique properties of int vs void types.
1. The int() Line (With Warnings)
When you write int(); as a standalone statement:
- The compiler can’t legally parse this as a function declaration (a valid function declaration requires a name, and there’s no valid identifier here).
- So it falls back to interpreting this as a value-initialization expression: this creates a temporary
intobject, initialized to0. - Since this temporary object isn’t used (you don’t assign it, pass it to a function, or bind it to a reference), your compilers (g7 and clang-3.9) correctly flag it with an "unused temporary variable" warning.
2. The void() Line (No Warnings)
Now for the confusing part: void();
- First, the compiler can’t parse this as a valid function declaration either (again, no function name, and
voidis a keyword that can’t be used as an identifier). - It also can’t create a temporary
voidobject—voidis an incomplete type that can’t be instantiated (you can’t have an object of typevoid). - Instead, the compiler interprets
void();as a void-type value-initialization expression. Per the C++ standard, this expression performs "value initialization" but doesn’t create any object (since there’s nothing to initialize). It’s essentially a no-op. - Since there’s no actual object or value here to be "unused", the compiler has nothing to warn about. There’s no entity being created and discarded—this line does nothing, so no warning is triggered.
Key Differences Between the Two Lines
int()creates a tangible temporary object that the compiler can detect as unused, hence the warning.void()is a no-op expression with no underlying object; there’s nothing to "waste" or leave unused, so no warning is generated.- Neither line triggers the Most Vexing Parse in the end, because neither can be legally parsed as a valid function declaration (missing a function name). The MVP only applies when both interpretations are syntactically valid.
内容的提问来源于stack exchange,提问作者Ivan Smirnov
相关产品推荐
相关产品推荐

