As per [结束.结束]/2 http://eel.is/c++draft/over.over#2,我们执行模板参数推导。这对于所有三个重载都会成功:在第一个重载中,保持[temp.deduct.funcaddr]/2 http://eel.is/c++draft/temp.deduct.funcaddr#2心里:
函数模板的返回类型中的占位符类型 (7.1.7.4) 是非推导上下文。如果模板
对于这样的函数,参数推导成功,返回类型由实例化确定
函数体。
Since the deduction will succeed (given that all template parameters have explicitly supplied arguments), the return type is deduced as int
. In the second case, deduction succeeds since the argument is provided, and in the third, T
will be deduced. †
继续到第4段 http://eel.is/c++draft/over.over#4,
如果选择了多个功能,[...]任何给定的功能
函数模板特化F1
如果集合包含则被消除
第二个函数模板特化,其函数模板是
比函数模板更专业F1
根据
14.5.6.2 的部分排序规则。经过这样的消除后,如果有的话,应仅保留一项选定的功能。
根据[温度扣除部分]/3 http://eel.is/c++draft/temp.deduct.partial#3,函数模板的函数类型用于部分排序。我们立即可以看到#1和#2的函数类型不包含任何参与推导的模板参数,因此通过添加[温度扣除部分]/4 http://eel.is/c++draft/temp.deduct.partial#4由核心问题引入1391 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1391的分辨率,其对应的P
s 不用于确定顺序。 @bogdan 解释道here https://stackoverflow.com/a/31735126/3647361为什么该决议有问题;最重要的是,排序只会导致 #1 和 #2 产生歧义。
也就是说,根据当前(可能有缺陷)的措辞,转换在所有情况下都是格式错误的。如果非依赖/推导参数对的部分排序是固定的,
- 情况 1 和 3 是不明确的,因为对于两个非依赖函数类型(#1 和 #2),不存在排序对。
- 情况 2 中的接受行为是正确的(如预期)。
† [temp.deduct.type]/8 http://eel.is/c++draft/temp.deduct.type#8 element 9 (T()
), in case you were curious.