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

时间:2018-12-14 17:18:14

标签: c++ c++11 void default-constructor

考虑以下代码:

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

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

为什么?

1 个答案:

答案 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{};会允许您这样做。