我知道(void)0
在 C/C++ 中这是无操作的。但是,当我查看 中的代码时<cassert>
,我看到了void (0)
。
我猜是类似int (0)
或 的东西int{0}
。我也试过了void{}
,它有效。这似乎是 的零初始化void
。
但是void
是一种不完整的类型,为什么编译器不抱怨?(g++-14 -std=c++23 -Wall
)
我知道(void)0
在 C/C++ 中这是无操作的。但是,当我查看 中的代码时<cassert>
,我看到了void (0)
。
我猜是类似int (0)
或 的东西int{0}
。我也试过了void{}
,它有效。这似乎是 的零初始化void
。
但是void
是一种不完整的类型,为什么编译器不抱怨?(g++-14 -std=c++23 -Wall
)
在标准中,
void(0)
和都是函数式显式类型转换表达式,其语义定义如下,void{}
对于
void(0)
,第一个句子适用,并且表达式在语义上等同于(void)0
,您已经知道了。进一步扩展,这相当于标准在expr.static.caststatic_cast<void>(0)
中对 进行特殊处理的地方。对于,第二个句子开始起作用,并且标准明确指定不执行任何初始化。在任一情况下,都不涉及“不完整类型的初始化”,这解释了为什么编译器不会抱怨。cv
void
void{}
当您
T(E)
在 C++ 中编写T
为类型和单个表达式时,这被称为函数式强制转换表达式,并且在语义上与E
旧式强制转换表达式完全等同。(T)E
所以
void(0)
完全等同于(void)0
。(在运算符优先级以及语法允许
T
包含的内容方面存在一些解析差异。)