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

嵌套模板化lambda编译错误:下述C++代码是否符合C++标准?

template <auto V1 = []{ return 0; }>
struct s {
    template <auto V2 = []{ return V1(); }>
    consteval int foo() { return V2(); }
};

int main() {
    return s{}.foo(); // error
}
结论

这段代码不符合C++标准规定,属于不合规代码。GCC判定代码非法是符合标准要求的,Clang出现内部编译错误属于编译器自身的缺陷。

不合规的核心原因
  • 问题根源是foo函数模板的非类型参数默认实参:[]{ return V1(); }
    • C++20确实允许无捕获lambda作为非类型模板参数,但模板默认实参中出现的lambda如果引用了外层模板的参数,需要满足常量求值的所有规则。这里内层lambda调用V1()的操作依赖外层模板参数V1的实例化结果,无法在确定内层模板默认实参的阶段完成合法的常量求值。
    • 标准明确规定,模板默认实参中依赖外部模板参数的表达式,必须在实例化时可以被独立解析为合法的常量表达式,本代码的写法无法满足该要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:39:02