Sil*_*cer 5 c++ templates overloading c++-concepts c++20
我刚刚了解到 C++ 概念比 SFINAE 优越得多,因为受概念约束的函数是有序的,这意味着受约束的函数被认为比受约束的函数更好。
编译器用于估计函数受约束程度的规则究竟如何?当混合非限制性和限制性重载时,这些规则如何与传统的重载决议相互作用?
为了简单起见...,在重载决策过程中:
首先,所有在没有约束的情况下可行但不满足约束的函数都被认为是不可行的。
因此,可行重载集合包含函数、模板函数和满足约束的受约束模板函数。
然后在第一步中选择最佳过载,而不考虑约束。在每个步骤中,编译器都会比较 2 个候选者,如果一个候选者看起来比另一个更好,则该候选者被认为比另一个更好匹配,而不考虑任何进一步的标准:
例如:
template <Concept1 T> foo(T&&);
template <Concept2 T> foo(const T&);
template <Concept3 T> foo(const T&);
void g(){
int i=10;
const int& j =i;
foo (j) // the compiler will check the 2 last foo
//to see if one is more constrained than the other
foo (i) //the first foo is selected even if the second or third foo could look like they are more constrained
}
Run Code Online (Sandbox Code Playgroud)
如果编译器可以证明,对于任何可能的模板参数集,如果满足 T1 的约束,则满足 T2 的约束,则模板 T1 比模板 T2 受到更多约束。它检查是否可以证明:
constraints of T1 statisfied ==> constraints of T2 satisfied
Run Code Online (Sandbox Code Playgroud)
其中的==>意思是暗示。
要进行这样的演示,编译器是相当有限的。它只会使用布尔代数的子集(仅and和or操作),其中操作数是将约束和概念分解为所谓的原子约束。为了简化原子约束,出现在约束和概念定义中的非折叠“逻辑与表达式”和“逻辑或表达式”的操作数。
我认为试图走得更远会导致抄袭标准。所以这里是最相关的标准部分的链接[temp.constr]