type-constraint的immediately-declared constraint-expression如何组合?两种concept模板构造等价吗?
C++概念约束的两种模板声明是否等价?
如果C是一个concept,以下两种模板构造是否等价?
template <C A, C B>
template <typename A, typename B> requires C<A> && C<B>
换句话说,与type-constraint关联的所有immediately-declared constraint-expression是否通过合取(&&)组合?
这一细节极为重要:若采用合取方式,带有C A和C B参数的模板会比仅带有C<A>或C<B>约束的模板更具约束性;若未采用合取,则两者互不更具约束性。我未能找到任何确认此点的标准措辞。
回答
这两种构造完全等价,与type-constraint关联的各个immediately-declared constraint-expression确实通过合取(逻辑与&&)组合。
根据C++20标准的规定,模板参数列表中的每个type-constraint会为对应的模板参数生成独立的约束表达式,而模板的关联约束是所有这些约束表达式的合取结果。具体到这个场景:
template <C A, C B>会分别为A生成约束C<A>、为B生成约束C<B>,最终模板的关联约束就是C<A> && C<B>;- 这和显式写出
requires C<A> && C<B>的模板声明在约束效果上完全一致。
在模板重载决议时,这种合取的约束会被视为一个整体,因此带有C A, C B的模板,其约束强度等同于带有C<A> && C<B>的模板,会比仅包含C<A>或C<B>单一约束的模板更具约束性,匹配时会被优先选中。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

