Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++;20? P>我刚刚了解到C++概念比SIMEAE优越得多,因为概念约束的函数是有序的,这意味着约束函数比约束较少的函数更好。_C++_Templates_Overloading_C++20_C++ Concepts - Fatal编程技术网

在C++;20? P>我刚刚了解到C++概念比SIMEAE优越得多,因为概念约束的函数是有序的,这意味着约束函数比约束较少的函数更好。

在C++;20? P>我刚刚了解到C++概念比SIMEAE优越得多,因为概念约束的函数是有序的,这意味着约束函数比约束较少的函数更好。,c++,templates,overloading,c++20,c++-concepts,C++,Templates,Overloading,C++20,C++ Concepts,编译器如何准确地使用规则来估计函数的约束程度? 当混合使用非约束过载和约束过载时,这些规则如何与传统过载解决方案相互作用?为了简化…,在过载解决过程中: 首先,所有在没有约束条件下可行但约束条件不满足的函数都被认为是不可行的 因此,可行重载集包含函数、模板函数和满足约束的约束模板函数 然后在第一步中,在不考虑约束的情况下选择最佳过载。在这些步骤中的每一步,编译器都会比较两个候选项。如果一个候选项看起来比另一个好,则认为该候选项比另一个更匹配,而不考虑任何其他标准: 它首先考虑参数转换 然后,如果

编译器如何准确地使用规则来估计函数的约束程度?
当混合使用非约束过载和约束过载时,这些规则如何与传统过载解决方案相互作用?

为了简化…,在过载解决过程中:

首先,所有在没有约束条件下可行但约束条件不满足的函数都被认为是不可行的

因此,可行重载集包含函数、模板函数和满足约束的约束模板函数

然后在第一步中,在不考虑约束的情况下选择最佳过载。在这些步骤中的每一步,编译器都会比较两个候选项。如果一个候选项看起来比另一个好,则认为该候选项比另一个更匹配,而不考虑任何其他标准:

  • 它首先考虑参数转换
  • 然后,如果一个是模板,另一个不是模板,则选择非模板
  • 在此步骤中,必须有两个模板。它考虑一个是否比另一个更专业(约束在这里不起任何作用)
  • 它考虑是否一个模板比另一个模板更受约束
  • 例如:

    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
        }
    
    其中
    ==>
    表示暗示

    要进行这样的演示,编译器是非常有限的。它将只使用布尔代数的子集(仅
    操作),其中操作数是约束和概念分解为所谓的原子约束。为了简化原子约束,需要在约束和概念定义中显示未折叠的“逻辑与表达式”和“逻辑或表达式”的操作数

    我想,如果再进一步,就会复制标准。这里有一个链接,指向最相关的标准部分

    constraints of T1 statisfied  ==>  constraints of T2 satisfied