考虑这对简单的函数模板。
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
匿名用户
声明:我们考虑的类型总是参数类型。类型/价值类别等。在重载决策中只考虑传递的实际参数,而不考虑部分排序。
偏序在两个“回合”中考虑两个重载,其中一个模板始终是参数模板,另一个模板是参数模板。[临时扣除部分]/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 >在函数调用的上下文中,使用的类型是函数调用有参数的那些函数参数类型。[..]
上述参数模板中指定的每种类型和参数模板中相应的类型都用作P
和A
。
因此,我们有两个转弯,在这两个转弯中,我们都有一个P
型和一个a
:
转弯 1:
转2:
但在游戏开始之前,也会对这些类型执行一些转换-我缩写为[temp.decrete.partial]/5
- 如果<code>P</code>或<code>A</code>是引用,则它们将替换为它们引用的类型。
- 删除任何顶级cv限定符
请注意,删除的 cv 限定符将被“记住”以备后用。[部分扣除]/6:
如果P
和A
都是引用类型(在被上面提到的类型替换之前),确定两种类型中的哪一种(如果有)比另一种更符合cv条件;否则,出于部分排序的目的,这些类型被认为同样符合cv条件。下面将使用此确定的结果。
因此,我们只剩下
转弯 1:
转2:
现在我们执行演绎,通过设置< code>T=Unique[1/2],演绎在两个回合中都成功了。从[临时扣除部分]/8:
如果给定类型的演绎成功,则参数模板中的类型至少与参数模板中的类型一样专业化。
这给了我们两个Unique1
但是,这是 [temp.reduce.partial]/(9.2) 步骤中的位置:
如果对于给定的类型,演绎在两个方向上都成功(即,上述变换后类型是相同的),并且 P
和 A
都是引用类型(在被替换为上述类型之前):
>
[……];否则
如果参数模板中的类型比参数模板中的类型(如上所述)更符合 cv 条件,则参数类型至少不被视为与参数类型一样专业化。
被记住的cv限定符开始发挥作用。A2
比P2
“更符合cv标准(如上所述)”,因此P2
被认为至少与A2
一样专业。
最后,[temp.deduct.partial]/10:
函数模板F
至少与函数模板G
一样专业,如果对于用于确定排序的每对类型,F
中的类型至少与G
中的类型一样专业。
F
比G
更专业,如果F
至少与G
一样专业,并且G
至少不像F
那样专业。
意味着由于类型T
第9段中的上述规则目前是由R. Smith在四个月前创建的CWG #2088的主题:
应用14.8.2.4[temp.deduct.partial]第9段中左值-vs-右值引用和cv限定的后期决胜局
如果对于给定的类型,演绎在两个方向上都成功(即,上述变换后类型是相同的),并且 P
和 A
都是引用类型(在被替换为上述类型之前):
但是,这是基于错误的假设。[..]我们需要确定规则是“推导在两个方向上都成功”还是“类型相同”。后者似乎更合理。
不过,这不会改变建立的结果,因为我们得到的类型确实是相同的。
请考虑以下人为的代码段: 如果第二个重载被更改为采用至少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)。 函数模板也可以用其他
问题内容: 我在主布局文件中有这个 我的目录结构中有header.html部分模板。 如何在我的应用程序中包含此模板?我认为angular在处理完控制器后会自动包含模板,但是它不起作用。 标头节点应替换为此文件的内容。 问题答案: 包含来自外部文件的模板/ html片段的一种方法是使用指令(doc)。 要么
1 决策树理论 1.1 什么是决策树 所谓决策树,顾名思义,是一种树,一种依托于策略抉择而建立起来的树。机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。 树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,从根节点到叶节点所经历的路径对应一个判定测试序列。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 1.2 决策树学习流