为什么我可以使用 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)。
为什么?
void
is 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{};
。