template <typename T>
void show(T&); // #1
template <typename T>
void show(T const&); // #2
int main()
{
int a = 0;
show(a); // #1 to be called
}
我对这些部分排序规则感到困惑。以下是一些报价:[temp.deduct.partial]/5
在完成偏序之前,对用于偏序的类型执行某些转换:
如果
P
是引用类型,P
则替换为引用的类型。如果
A
是引用类型,A
则替换为引用的类型。
如果
P
和A
都是引用类型(在被上面提到的类型替换之前),确定这两种类型中的哪一种(如果有的话)比另一种更具 cv 限定性;否则,这些类型被认为是同等 cv 限定的,用于部分排序目的。下面将使用该确定的结果。
删除任何顶级 cv 限定符:
如果
P
是 cv 限定类型,P
则替换为 的 cv 不限定版本P
。如果
A
是 cv 限定类型,A
则替换为 的 cv 不限定版本A
。
首先,两者void show(T&)
和void show(T const&)
都可以通过传递int
左值来调用,因此我们需要使用偏序规则来决定哪个函数更匹配。然后,根据上面的引用,我们做一些转换。步骤1:
T& => T #3
T const& => T const #4
第2步:
T => T #5
T const => T #6
#5 => #6
, #6 => #5
, 双向推演成功。然后以下规则起作用:[temp.deduct.partial]/9
如果对于给定类型,推导在两个方向上都成功(即,在上述转换之后类型相同)并且两者
P
都是A
引用类型(在被上述类型替换之前):
如果参数模板中的类型是左值引用,而参数模板中的类型不是,则参数类型不被认为至少与参数类型一样特化;
否则,如果参数模板中的类型比参数模板中的类型更具 cv 限定性(如上所述),则参数类型不被认为至少与参数类型一样特化。
那么#4
更专业呢#3
。对于给定的 value a
,#2
应该调用#1
function,但实际上调用的是 function。为什么?我的理解有问题吗?