考虑以下代码:
void foo() { return void(); }
void bar() { return void{}; }
foo()
编译,但是bar()
doesn't(在GodBolt上使用GCC 8.2和clang 7.0)。
为什么?
答案 0 :(得分:2)
void
is an incomplete type。由于它是不完整的类型,因此表达式void{}
是非法的。
void()
在[expr.type.conv]/2中被授予例外
[...]如果类型为cv void,并且初始化程序 是(),该表达式是不执行初始化的指定类型的prvalue。 [...]
在通用代码中可能有用/有用。
上面有一个active issue,而current proposed wording for the C++20 draft是
[...]否则,如果类型为cv void,并且初始值设定项为()或{}(在扩展包之后,如果有的话),则表达式是不执行初始化的指定类型的prvalue。 [...]
如果接受,return void{};
会允许您这样做。