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()创建纯右值的法律表达式,但这不属于本文的重点。)
标准中看似相关的段落:
不完全定义的对象类型和 cv void 是不完整类型 ([basic.fundamental])。
不完全定义的对象类型的实例的大小和布局是未知的。
\n\n如果初始值设定项是带括号的单个表达式,则类型转换表达式等效于相应的强制转换表达式。否则,如果类型为
\ncv void且初始值设定项为()or{}(在包扩展之后,如果有),则表达式是不执行初始化的指定类型的纯右值。否则,表达式是指定类型的纯右值,其结果对象是使用初始值设定项直接初始化的。如果初始值设定项是带括号的可选表达式列表,则指定的类型不应是数组类型。
所以void{}等于void()有效 (cv)void 纯右值的结果