这个模板类型推导和重载解析是如何工作的?

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());
}

Wandbox.

代码说明

它会调用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());
}

Wandbox.

导致不明确的过载错误。所以我有两个问题:

问题

  1. 如何在代码 #1 中推导出 container

    据我所知,模板实例化期间的类型推导无法通过成员类型回溯以找到封闭的类型(在本例中为std::vector<int>)。

  2. 就算能回溯,为什么编译出来也没有出现模糊重载错误?

How container was deduced in code #1?

由于non-deduced context,

,模板实参推导无法推导

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 没有这样的问题,你的 sortstd::sort 都是有效的候选者然后导致模棱两可的重载错误。