此模板类型推导和重载解析如何工作?

Inc*_*ble 11 c++ templates language-lawyer argument-dependent-lookup c++17

代码#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());
}
Run Code Online (Sandbox Code Playgroud)

Wandbox.

代码说明

它将调用std::sortADL找到的函数.虽然代码如下:

代码#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());
}
Run Code Online (Sandbox Code Playgroud)

Wandbox.

导致模糊的过载错误.所以我有两个问题:

问题

  1. 如何container在代码#1中推断出来?

    据我所知,模板实例化期间的类型推导不能回溯成员类型以找到封闭的(std::vector<int>在这种情况下).

  2. 即使它可以回溯,为什么编译时不会导致模糊的过载错误?

son*_*yao 14

如何container在代码#1中推断出来?

由于非推断的上下文,在模板参数推导期间无法推导出它,

1)::使用qualified-id指定的类型的嵌套名称说明符(作用域解析运算符左侧的所有内容):

这意味着sort根本不会考虑您的重载决策,然后std::sort调用没有歧义.

代码#2没有这样的问题,你sortstd::sort有效的候选人都会导致模糊的重载错误.