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

重载决策和部分模板排序

乐正秦斩
2023-03-14

考虑这对简单的函数模板。

template <typename T>
void foo(T& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; }

template <typename C>
void foo(const C& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; }

如果我们使用非const参数调用foo

int i = 4;
foo(i);

T

但是,如果我们用 const 参数调用 foo

const int ci = 42;
foo(ci);

常数C


共有1个答案

谷梁卓
2023-03-14
匿名用户

声明:我们考虑的类型总是参数类型。类型/价值类别等。在重载决策中只考虑传递的实际参数,而不考虑部分排序。

偏序在两个“回合”中考虑两个重载,其中一个模板始终是参数模板,另一个模板是参数模板。[临时扣除部分]/2:

对于所涉及的每个模板,都有原始函数类型和转换后的函数类型。[..]演绎过程使用转换后的类型作为参数模板,使用其他模板的原始类型作为参数模板。对于部分排序比较中涉及的每种类型的,此过程执行两次:一次使用转换后的 template-1 作为参数模板,使用 template-2 作为参数模板,再次使用转换后的 template-2 作为参数模板,使用 template-1 作为参数模板。

您应该熟悉转换后的“模板”的生成方式。这在§14.5.6.2/3中有规定。

为了生成转换后的模板,对于每个类型、非类型或模板,模板参数(包括其模板参数包(14.5.3 ))分别合成唯一的类型、值或类模板,并将其替换为模板的函数类型中该参数的每次出现。

因此,我们的(转换的)参数模板是

void foo( Unique1& );

void foo( Unique2 const& );

[temp.deduct.partial]/3

用于确定排序的类型取决于完成部分排序的上下文:

    < li >在函数调用的上下文中,使用的类型是函数调用有参数的那些函数参数类型。[..]

上述参数模板中指定的每种类型和参数模板中相应的类型都用作PA

因此,我们有两个转弯,在这两个转弯中,我们都有一个P型和一个a

转弯 1:

转2:

但在游戏开始之前,也会对这些类型执行一些转换-我缩写为[temp.decrete.partial]/5

  • 如果<code>P</code>或<code>A</code>是引用,则它们将替换为它们引用的类型。
  • 删除任何顶级cv限定符

请注意,删除的 cv 限定符将被“记住”以备后用。[部分扣除]/6:

如果PA都是引用类型(在被上面提到的类型替换之前),确定两种类型中的哪一种(如果有)比另一种更符合cv条件;否则,出于部分排序的目的,这些类型被认为同样符合cv条件。下面将使用此确定的结果。

因此,我们只剩下

转弯 1:

转2:

现在我们执行演绎,通过设置< code>T=Unique[1/2],演绎在两个回合中都成功了。从[临时扣除部分]/8:

如果给定类型的演绎成功,则参数模板中的类型至少与参数模板中的类型一样专业化。

这给了我们两个Unique1

但是,这是 [temp.reduce.partial]/(9.2) 步骤中的位置:

如果对于给定的类型,演绎在两个方向上都成功(即,上述变换后类型是相同的),并且 PA 都是引用类型(在被替换为上述类型之前):

>

  • [……];否则

    如果参数模板中的类型比参数模板中的类型(如上所述)更符合 cv 条件,则参数类型至少不被视为与参数类型一样专业化。

    被记住的cv限定符开始发挥作用。A2P2“更符合cv标准(如上所述)”,因此P2被认为至少与A2一样专业。

    最后,[temp.deduct.partial]/10:

    函数模板F至少与函数模板G一样专业,如果对于用于确定排序的每对类型,F中的类型至少与G中的类型一样专业。
    FG更专业,如果F至少与G一样专业,并且G至少不像F那样专业。

    意味着由于类型T

    第9段中的上述规则目前是由R. Smith在四个月前创建的CWG #2088的主题:

    应用14.8.2.4[temp.deduct.partial]第9段中左值-vs-右值引用和cv限定的后期决胜局

    如果对于给定的类型,演绎在两个方向上都成功(即,上述变换后类型是相同的),并且 PA 都是引用类型(在被替换为上述类型之前):

    但是,这是基于错误的假设。[..]我们需要确定规则是“推导在两个方向上都成功”还是“类型相同”。后者似乎更合理。

    不过,这不会改变建立的结果,因为我们得到的类型确实是相同的。

  •  类似资料:
    • 请考虑以下人为的代码段: 如果第二个重载被更改为采用至少2种类型的包而不是至少一种类型的包时,gcc和clang都接受这两个调用: 如果未推导出的模板参数被移动到推导出的模板参数,则: 我希望每个版本的所有调用都可以。上面代码示例的预期结果是什么?

    • 本教程上接 教程 第2部分 。我们将继续 开发 Web-poll 应用并且专注在创建公共界面 – “视图 (views )”。 哲理 在 Django 应用程序中,视图是一“类”具有特定功能和模板的网页。 例如,在一个博客应用程序中,你可能会有以下视图: 博客首页 – 显示最新发表的博客。 博客详细页面 – 一篇博客的独立页面。 基于年份的归档页 – 显示给定年份中发表博客的所有月份。 基于月份的

    • 具有以下3种重载 以下内容是否格式不正确? Clang选择重载#2,而gcc无法编译(演示) 移除过载#1时,双方同意选择过载#2(演示)。 删除重载#2时,gcc选择重载#1,clang编译失败(演示)

    • 模板函数与重载是密切相关的。从函数模板产生的相关函数都是同名的,因此编译器用重载的解决方法调用相应函数。 函数模板本身可以用多种方式重载。我们可以提供其他函数模板,指定不同参数的相同函数名。例如,图12.2的printArray函数模板可以用另一printArray函数模板重载,用参数lowSubscriPt和highSubscript指定要打印的数组部分(见练习12.4)。 函数模板也可以用其他

    • 1 决策树理论 1.1 什么是决策树   所谓决策树,顾名思义,是一种树,一种依托于策略抉择而建立起来的树。机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。 树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,从根节点到叶节点所经历的路径对应一个判定测试序列。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 1.2 决策树学习流

    • 问题内容: 我在主布局文件中有这个 我的目录结构中有header.html部分模板。 如何在我的应用程序中包含此模板?我认为angular在处理完控制器后会自动包含模板,但是它不起作用。 标头节点应替换为此文件的内容。 问题答案: 包含来自外部文件的模板/ html片段的一种方法是使用指令(doc)。 要么