如何正确使用C++20 concepts?自定义concept约束未生效问题求助
问题核心原因
你对C++20 requires 表达式的语法语义理解有误:
- 无后置返回类型约束的简单 requires 表达式条目,仅检查对应表达式能否合法编译,不会校验表达式的求值结果
你原来写的两条约束:
{array.max_size() >= 2U}; {std::is_arithmetic_v<typename A::value_type> == true};
对于std::array<std::string, 1>来说,这两个比较运算都可以正常编译,所以两条约束都会判定为满足,最终ProperArray概念的求值结果为true,才会输出你意料之外的Valid array.。
正确的concept编写方案
有两种常用写法可以实现你要的「同时满足两个编译期布尔条件」的约束效果:
方案1:直接在概念定义中写布尔谓词(最简单,适合当前场景)
因为std::array的max_size是静态常量、std::is_arithmetic_v是编译期类型 trait,不需要放在requires块中即可直接校验:
template<typename A> concept ProperArray = A::max_size() >= 2U && std::is_arithmetic_v<typename A::value_type>;
方案2:使用requires嵌套约束(适合需要同时检查成员存在性+值条件的通用场景)
如果要兼容更多可能的数组/容器类型,需要先确认类型存在max_size静态成员、value_type成员,再校验对应条件,就用嵌套requires写法:
template<typename A> concept ProperArray = requires { // 带requires前缀的条目会校验表达式的求值结果为true requires A::max_size() >= 2U; requires std::is_arithmetic_v<typename A::value_type>; };
修改后再测试ProperArray<std::array<std::string, 1>>的求值结果就会是false,不会再进入Valid array.的输出分支。
内容的提问来源于stack exchange,提问作者Hydrogen
相关产品推荐
相关产品推荐

