gpt4 book ai didi

c++ - C++20 中概念约束函数的排序规则是什么?

转载 作者:行者123 更新时间:2023-12-01 14:07:37 28 4
gpt4 key购买 nike

我刚刚了解到 C++ 概念比 SFINAE 优越得多,因为受概念约束的函数是有序的,这意味着更多约束的函数被认为比约束更少的函数更好。

编译器用于估计函数受约束程度的规则究竟如何?
当混合非限制性和限制性重载时,这些规则如何与传统的重载决议相互作用?

最佳答案

为简单起见...,在重载解析过程中:

首先,所有在没有约束的情况下可行但不满足约束的功能都被认为是不可行的。

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

然后在不考虑约束的第一步中选择最佳过载。在这些步骤中的每一步,编译器比较 2 个候选者,如果一个候选者看起来比另一个更好,则该候选者被认为是比另一个更好的匹配,而不考虑任何进一步的标准:

  • 它首先考虑参数转换
  • 然后,如果一个是模板而另一个不是,它选择非模板一个
  • 在这一步,必然有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

    哪里 ==>意味着暗示。

    要做这样的演示,编译器是相当有限的。它将仅使用 bool 代数的子集(仅 andor 运算),其中操作数是将约束和概念分解为所谓的原子约束。简化原子约束是出现在约束和概念定义中的未折叠的“逻辑和表达式”和“逻辑或表达式”的操作数。

    我认为试图更进一步会导致复制标准。所以这里是最相关标准部分的链接 [temp.constr]

    关于c++ - C++20 中概念约束函数的排序规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61907826/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com