当前位置: 首页 > 知识库问答 >
问题:

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

伯洋
2023-03-14

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

共有1个答案

况繁
2023-03-14

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

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

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

    null

例如:

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

其中==>表示暗示。

 类似资料:
  • 在cppreference上,有一个示例定义了概念。我复制了下面的示例: 这个概念对许多用途都有意义。在这些情况下,类型的对象上的哈希函数是专门化。但是,出于我的目的,我不想假设哈希将是。我希望用户能够提供一个不同的哈希函数。 由于和绑定得如此紧密,所以我不认为可以为和定义单独的概念。那是正确的吗?因此,我想定义一个概念,它同时处理和。 null

  • 根据最近科隆ISO C++会议上的reddit报告,在即将发布的标准中,我们将能够指定模板的概念,并且对于每个类/函数模板,我们将能够设置对其类型的约束。然而,在文档和教程中(例如这里),我找不到多类型用例的正确语法。 但它们都抛出语法错误。我认为答案应该在Bjarne Stroustrup的规范P0557中的某个地方,但我很快就找不到了。

  • 我正在寻找将以下内容标记为错误的规则: 我想在正文中有多个语句时强制换行,因此这应该是正确的: 哪些规则适用于此?我好像找不到。我确实希望继续允许返回单行程序(例如,

  • 我正在学习TypeScript,目前正在尝试创建一个通用排序函数。 我有两个接口: 而我现在的函数看起来是这样的: 上面的代码工作,但我得到警告: 没有与此调用匹配的重载。重载5中的1’(值:字符串|数字|日期):日期),导致以下错误。“T[K]”类型的参数不能分配给“string | number | Date”类型的参数。类型“T[keyof T]”不可分配给类型“string | numbe

  • 对于概念,提供了很好的语法,如