Difference between parsing of void() and int()

后端 未结 2 510
忘掉有多难
忘掉有多难 2021-01-04 09:15

Having read about the most vexing parse, I experimented a bit and found this program. There are two very similar lines. One of them yields warnings in both g++7 and clang++-

相关标签:
2条回答
  • 2021-01-04 09:39

    There is no difference in parsing. Both cases are covered by simple-type-specifier followed by optional parenthesized expression-list.

    The semantic meaning is specified in C++17 (N4659) [expr.type.conv]/2:

    If the type is cv void and the initializer is () , the expression is a prvalue of the specified type that performs no initialization. Otherwise, the expression is a prvalue of the specified type whose result object is direct-initialized with the initializer.

    This specifically says that void() is a prvalue of type void.

    Now, I'm sure that it is not intended that a prvalue of type void be illegal, as it is a common occurrence, e.g. (void)x; or calling a void function!

    But I can't find where in the Standard it says that temporary materialization should be suppressed for void prvalues. The [class.temporary]/2 seems to say that a discarded-value expression always materializes a temporary; and it is an error to materialize a prvalue of incomplete type. Maybe it is a defect in the standard.


    The difference in warning about "unused value" is probably because an unused value of type void is a common occurrence and it would not be helpful to warn about.

    0 讨论(0)
  • 2021-01-04 09:41

    It is parsed the same way.

    Warnings don't come from the parser. They arise during semantic analysis. The SA noticed that a value was created an destroyed by int(); without being read or written.

    In the void case, there is no value, so no warning.

    0 讨论(0)
提交回复
热议问题