重载决策中的参数包

问题描述 投票:0回答:1

考虑以下代码:

template<class T>
void f(const T& a, const T&b) { std::cout << "#1"; }

template<class ...T>
void f(T&& ...a) { std::cout << "#2"; }
 
int main() { f(0, 1); } // prints #2

我想知道为什么 #2 在重载解析期间被认为更专业。以下是我对 #1 更加专业化的推理。

遵循确定函数模板的偏序的规则,我们首先对转换后的#1相对于原始模板#2进行推导。从标准

为每种类型、非类型或 template模板参数(含模板参数包 (13.7.4) 合成一个唯一的类型、值或类模板 分别并将其替换为该参数的每次出现 在模板的函数类型中。

假设转换后的 #1 的唯一合成类型是

T
U
。然后在模板参数推导过程中,对于参数
a
b
,我们有
P = T&&
A = const U&
。遵循演绎规则,我们对两个参数都得到
T = const U&
。推导成功,因此#1 至少与#2 一样专业。

现在我们根据原始模板#1 对转换后的#2 进行推导。根据这一段

如果P_i对应的参数声明是一个函数 参数包,然后将其 declarator-id 的类型与 A 的参数类型列表中的每个剩余参数类型。每个 比较推导出后续位置的模板参数 模板参数包由函数参数包扩展。 偏序时,如果A_i原本是函数参数 包装:

  • 如果 P 不包含函数参数类型 对应于A_i则A_i被忽略;
  • 否则,如果P_i不是函数参数包,则模板参数推导 失败了。

在我们的例子中,我们的第一个参数

A_1
最初是一个函数参数包,但
P_1
不是一个参数包。因此模板参数推导失败,并且#2 至少不像#1 那样专业化。所以#1 更专业。

我的推理哪里崩溃了?

c++ templates overloading overload-resolution parameter-pack
1个回答
0
投票

我想知道为什么 #2 在重载解析期间被认为更专业。

稍后会考虑。

选择已根据“之前”的标准完成:

来自最佳可行功能

  1. F1 中至少有一个参数的隐式转换优于 F2 中该参数的相应隐式转换

然后从Ranking_of_implicit_conversion_sequences

e) 或者,如果不是这样,S1 和 S2 都绑定到仅在顶级 cv 限定方面不同的引用参数,并且 S1 的类型比 S2 的类型具有更少的 cv 限定。

© www.soinside.com 2019 - 2024. All rights reserved.