构造一个空对象

303*_*303 7 c++ language-lawyer c++20

由于出现错误,以下代码示例似乎使用 GCC 12.2 进行编译,与 Clang 15 和 MSVC 19.33 不同illegal initializer type 'void'。我预计代码会被所有三个编译器拒绝,因为构造(临时)void 对象没有意义。

auto f() { return void{}; }

using t = decltype(f());
Run Code Online (Sandbox Code Playgroud)

在示例中,函数f仅与未计算的操作数一起使用。f是否允许这样使用,或者甚至应该拒绝它的定义?(我知道void()创建纯右值的法律表达式,但这不属于本文的重点。)

标准中看似相关的段落:

[basic.types]/5

不完全定义的对象类型和 cv void 是不完整类型 ([basic.fundamental])。

[basic.types]/11.43

不完全定义的对象类型的实例的大小和布局是未知的。

app*_*ple 4

来自\xc2\xa7expr.type.conv

\n
\n

如果初始值设定项是带括号的单个表达式,则类型转换表达式等效于相应的强制转换表达式。否则,如果类型为cv void且初始值设定项为()or{}(在包扩展之后,如果有),则表达式是不执行初始化的指定类型的纯右值。否则,表达式是指定类型的纯右值,其结果对象是使用初始值设定项直接初始化的。如果初始值设定项是带括号的可选表达式列表,则指定的类型不应是数组类型。

\n
\n

所以void{}等于void()有效 (cv)void 纯右值的结果

\n