如何在C++ requires子句中将lambda表达式用作常量主表达式?
C++ requires子句的指定方式与lambda表达式的问题分析
我们先从基础模板函数入手:
template<typename T> T func(T t) { return t; }
可以给它添加一个无实际约束效果的requires子句,写法如下:
template<typename T> requires true T func(T t) { return t; }
调用时直接写func(1);即可正常编译。
接下来尝试用lambda表达式作为requires子句的内容:
template<typename T> requires [] { return true; } T func(T t) { return t; }
但用VS2019/VS2022的cl.exe编译时,会触发错误:error C7607: 原子约束必须是布尔类型的常量表达式...,即使给lambda加上constexpr修饰也无法解决,且这里明确不需要requires ([] { return true; }())这种调用lambda的写法。
核心原因解析
requires子句要求的是布尔类型的常量表达式——它需要最终求值为一个bool值,而lambda表达式本身是一个闭包对象,属于用户定义类型,并非bool类型。哪怕是constexpr lambda,它本质还是一个可调用的对象,不是直接的布尔常量。cppreference提到lambda属于主表达式,只是说明它在语法上可以作为表达式使用,但这并不意味着它满足requires子句对表达式类型和求值结果的要求。
简单来说:requires要的是一个bool常量,而你给的是一个能返回bool的对象,这完全是两回事,所以编译报错。
内容的提问来源于stack exchange,提问作者ur.
相关产品推荐
相关产品推荐

