[英]How does this template type deduction and overload resolution work?
#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());
}
Wandbox 。
它将调用std::sort
函数,该函数由ADL发现。 虽然代码如下:
#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());
}
Wandbox 。
导致模糊的过载错误。 所以我有两个问题:
如何在代码#1中推断出container
?
据我所知,模板实例化期间的类型推导不能回溯成员类型以找到封闭的(在这种情况下为std::vector<int>
)。
即使它可以回溯,为什么编译时不会导致模糊的过载错误?
如何在代码#1中推断出
container
?
由于非推断的上下文 ,在模板参数推导期间无法推导出它,
1)使用qualified-id指定的类型的嵌套名称说明符(作用域解析运算符
::
左侧的所有内容):
这意味着您的sort
根本不会被考虑用于重载解析,然后调用std::sort
而不会产生歧义。
代码#2没有这样的问题,你的sort
和std::sort
都是有效的候选者,然后导致模糊的重载错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.