这个模板类型推导和重载解析是如何工作的?
How does this template type deduction and overload resolution work?
代码#1
#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>
template <typename container>
void sort(typename container::iterator beginning,
typename container::iterator end)
{
std::cout << "calling custom sorting function\n";
}
int main()
{
std::vector<int> v{1, 2, 3};
sort(v.begin(), v.end());
}
代码说明
它会调用ADL找到的std::sort
函数。虽然下面的代码:
代码#2
#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>
template <typename Iterator>
void sort(Iterator beginning,
Iterator end)
{
std::cout << "calling custom sorting function\n";
}
int main()
{
std::vector<int> v{1, 2, 3};
sort(v.begin(), v.end());
}
导致不明确的过载错误。所以我有两个问题:
问题
如何在代码 #1 中推导出 container
?
据我所知,模板实例化期间的类型推导无法通过成员类型回溯以找到封闭的类型(在本例中为std::vector<int>
)。
就算能回溯,为什么编译出来也没有出现模糊重载错误?
How container
was deduced in code #1?
,模板实参推导无法推导
1) The nested-name-specifier (everything to the left of the scope resolution operator ::
) of a type that was specified using a qualified-id:
这意味着您的 sort
根本不会被考虑用于重载决议,然后 std::sort
将被毫无歧义地调用。
代码 #2 没有这样的问题,你的 sort
和 std::sort
都是有效的候选者然后导致模棱两可的重载错误。
代码#1
#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>
template <typename container>
void sort(typename container::iterator beginning,
typename container::iterator end)
{
std::cout << "calling custom sorting function\n";
}
int main()
{
std::vector<int> v{1, 2, 3};
sort(v.begin(), v.end());
}
代码说明
它会调用ADL找到的std::sort
函数。虽然下面的代码:
代码#2
#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>
template <typename Iterator>
void sort(Iterator beginning,
Iterator end)
{
std::cout << "calling custom sorting function\n";
}
int main()
{
std::vector<int> v{1, 2, 3};
sort(v.begin(), v.end());
}
导致不明确的过载错误。所以我有两个问题:
问题
如何在代码 #1 中推导出
container
?据我所知,模板实例化期间的类型推导无法通过成员类型回溯以找到封闭的类型(在本例中为
std::vector<int>
)。就算能回溯,为什么编译出来也没有出现模糊重载错误?
,模板实参推导无法推导How
container
was deduced in code #1?
1) The nested-name-specifier (everything to the left of the scope resolution operator
::
) of a type that was specified using a qualified-id:
这意味着您的 sort
根本不会被考虑用于重载决议,然后 std::sort
将被毫无歧义地调用。
代码 #2 没有这样的问题,你的 sort
和 std::sort
都是有效的候选者然后导致模棱两可的重载错误。