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

constexpr Lambda在MSVC编译通过但GCC/Clang报错,哪个符合标准?

问题解答

结论

GCC和Clang的编译行为符合C++标准,MSVC允许代码编译属于非标准扩展。

原因分析

根据C++标准的lambda捕获规则:

  • 对于自动存储期的局部变量(比如代码中main函数内定义的func),如果在lambda表达式中被odr-used(即需要访问变量实体,比如调用其成员函数、取地址等),必须显式捕获该变量(值捕获、引用捕获或使用捕获默认均可)。
  • 代码中func()是调用lambda对象func的函数调用运算符,属于对func的odr-used操作,因此必须捕获func才能在lambda中使用。

GCC给出的错误提示准确指出了问题:lambda没有设置捕获默认,且未显式捕获func,违反了标准规则。而MSVC的编译通过是其自身的非标准扩展行为,不符合C++标准要求。

修正后的代码示例

要让代码符合标准,只需显式捕获func即可,比如:

int main() {
    constexpr auto func = []()constexpr { return 1; };
    auto i = [func]{return func();}; // 值捕获
}

也可以使用引用捕获或捕获默认的写法,同样符合标准。

内容的提问来源于stack exchange,提问作者user20562802

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:41:07