嵌套模板化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的实例化结果,无法在确定内层模板默认实参的阶段完成合法的常量求值。 - 标准明确规定,模板默认实参中依赖外部模板参数的表达式,必须在实例化时可以被独立解析为合法的常量表达式,本代码的写法无法满足该要求。
- C++20确实允许无捕获lambda作为非类型模板参数,但模板默认实参中出现的lambda如果引用了外层模板的参数,需要满足常量求值的所有规则。这里内层lambda调用
内容的提问来源于stack exchange,提问作者Mechap
相关产品推荐
相关产品推荐

