You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

标准依据分析

  1. void()的合法性
    根据C++标准的[expr.type.conv]条款,当T为void时,T()是合法的表达式,会产生一个void类型的纯右值,无任何副作用。这种写法允许我们在模板中统一处理包括void在内的所有类型,无需额外特化或重载,这也是所有编译器都接受foo<void>()的原因。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:35:21