C++模板形式化排序规则
C++ Template Formal Ordering Rules
我很难理解形式排序规则是如何工作的,如D.Vandevoorde和N.m.Josuttis的《C++模板,完整指南》一书的第12章所述。在本书第188页,作者给出了以下场景,用于决定两个可行的函数模板中哪一个更专业:
根据这两个模板,我们通过替换前面描述的模板参数来合成两个参数类型列表:
(A1)
和(A2*)
(其中A1
和A2
是唯一的组合类型)。显然,通过将A2*
替换为T
,第一个模板相对于第二个参数类型列表的推导是成功的。然而,没有办法使第二模板的T*
与第一列表中的非帧间类型A1
匹配。因此,我们正式得出结论,第二个模板比第一个模板更专业。
我想了解一下这个例子。
编辑
我相信上面引用的两个功能模板是
template<typename T>
int f(T)
{
return 1;
}
template<typename T>
int f(T*)
{
return 2;
}
这些规则比使用起来更难解释。其思想是,如果更专业化的可能实例化集是不太专业化的一个可能实例化集的严格子集,则一个模板比另一个模板更专业化。
也就是说,每一个可以用作更专业化的参数的类型也可以用作不太专业化的变量,并且至少有一个类型可以与不太专业的变量一起使用,而不能与更专业的变量一同使用。
给定两个模板:
template <typename A> void f( A ); // [1]
template <typename B> void f( B* ); // [2]
要解决的问题是,其中哪一个更为通用(即可以采用更多的参数)。标准中的整个描述是根据用于A
和B
的合成独特类型进行的,但我们可以尝试通过挥手来解决。
假设我们找到了一个与第二个模板参数匹配的类型X
,那么第二个模版的实例化将看起来像void f( X* )
(除了它是一个模版这一事实之外)。现在,模板[1]可以用来生成一个等价的函数吗?是的,通过在类型推导中设置A == X*
。我们能朝相反的方向做吗?假设我们找到一个类型Y
,用它可以实例化第一个模板,我们得到void f( Y )
。第二个模板可以匹配此调用吗?否,仅对于指针类型的子集,上一条语句可以容纳。
这意味着第二个模板更加专业化,因为对于第二个模版的每个有效实例化,我们也可以实例化第一个模版,但第一个模版的一些实例化不是第二个的有效实例化。
例如,f( char* )
可以由两个模板匹配,但f( 5 )
只能由第一个模板匹配。根据合成类型进行奇怪解释的原因是,单个示例不能保证顺序,它必须适用于所有类型。合成型是任何型的代表。
我认为作者的观点是,第一个模板中的T既可以与类型a匹配,也可以与指向类型a*的指针匹配,而第二个模板只能与指向类型a*的指针相匹配,因此第二个模版更专业。
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 此代码是否违反一个定义规则
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 在 C++20 中对概念约束函数进行排序的规则是什么?
- 操作员的排序规则和副作用
- 在ICU中获取正确的排序规则设置
- ICU:创建不区分大小写的排序规则
- 为什么编译器不强制保留排序规则?
- C++模板形式化排序规则
- as-if规则是否防止编译器对全局/成员变量的访问重新排序
- c++ as-if规则是否允许存储区重新排序
- 按相反顺序排序。 "Don't repeat yourself"规则
- 类中成员声明重新排序的规则
- 根据字符串变量设置的规则进行排序
- SQLite 的不区分大小写的 UTF-8 字符串排序规则 (C/C++)