【发布时间】:2020-05-20 07:52:59
【问题描述】:
我刚刚了解到 C++ 概念比 SFINAE 优越得多,因为受概念约束的函数是有序的,这意味着受约束越多的函数被认为比约束越少的函数匹配得更好。
编译器使用规则来估计函数的约束程度如何? 在混合非约束和约束重载时,这些规则如何与传统的重载解决方案相互作用?
【问题讨论】:
标签: c++ templates overloading c++20 c++-concepts
我刚刚了解到 C++ 概念比 SFINAE 优越得多,因为受概念约束的函数是有序的,这意味着受约束越多的函数被认为比约束越少的函数匹配得更好。
编译器使用规则来估计函数的约束程度如何? 在混合非约束和约束重载时,这些规则如何与传统的重载解决方案相互作用?
【问题讨论】:
标签: c++ templates overloading c++20 c++-concepts
为了简单...,在重载解析过程中:
首先,所有在没有约束条件下可行但不满足约束条件的功能都被认为是不可行的。
所以可行的重载集包含函数、模板函数和具有满足约束的受约束的模板函数。
然后在不考虑约束的第一步中选择最佳重载。在每个步骤中,编译器都会比较 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
}
如果编译器可以证明,对于任何可能的模板参数集,如果满足 T1 的约束,则满足 T2 的约束,则模板 T1 比模板 T2 更受约束。它检查是否可以证明:
constraints of T1 statisfied ==> constraints of T2 satisfied
==> 表示暗示。
要进行这样的演示,编译器是相当有限的。它只会使用布尔代数的一个子集(仅and 和or 操作),其中操作数是约束和概念分解为所谓的原子约束。为了简化原子约束是出现在约束和概念定义中的非折叠“逻辑和表达式”和“逻辑或表达式”的操作数。
我想尝试更进一步会导致复制标准。所以这里是最相关的标准部分的链接[temp.constr]
【讨论】: