Clang中return void{}报错,return void()合法,是否符合C++标准?
为什么
return void{}在Clang中报错而return void()合法? 先看问题中的代码示例:
template<typename T> T foo() { return T(); } template<typename T> T bar() { return T{}; } int main() { // 所有编译器均通过 foo<void>(); // Clang中报错 bar<void>(); }
Clang 16对bar<void>()的报错信息为:
error: illegal initializer type 'void'
标准依据分析
void()的合法性
根据C++标准的[expr.type.conv]条款,当T为void时,T()是合法的表达式,会产生一个void类型的纯右值,无任何副作用。这种写法允许我们在模板中统一处理包括void在内的所有类型,无需额外特化或重载,这也是所有编译器都接受foo<void>()的原因。void{}的合法性
对于列表初始化T{},C++标准[dcl.init.list]明确规定:cv void类型的对象可以通过空初始化列表进行初始化。同时,void{}作为空列表初始化的表达式,其类型为void,完全符合返回类型为void的函数对返回表达式的要求([stmt.return]允许返回void类型的表达式)。因此return void{};在语法和语义上都是合法的,与return void();或return;等价。
结论
Clang拒绝return void{}的行为不符合C++标准,这是Clang的实现缺陷(Bug),而非严格遵循标准的表现——GCC和MSVC都正确接受了该写法,证明了这一点。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

