为什么我可以使用 void() 而不能使用 void{}?

Why can I use void(), but not void{}?

考虑以下代码:

void foo() { return void(); }
void bar() { return void{}; }

foo() 编译,但 bar() doesn't(在 GodBolt 上使用 GCC 8.2 和 clang 7.0)。

为什么?

voidis an incomplete type。由于它是不完整类型,因此表达式 void{} 是非法的。

void() 但是在 [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. [...]

哪些可以be/is在泛型代码中有用。


有一个active issue on this and the current proposed wording for the C++20 draft

[...] Otherwise, if the type is cv void and the initializer is () or {} (after pack expansion, if any), the expression is a prvalue of the specified type that performs no initialization. [...]

如果被接受,这将允许您return void{};