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


代码#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

代码说明

它会打电话给 std::sort 功能,由ADL发现。虽然代码如下:

代码#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. 怎么样 container 是在代码#1中推断出来的?

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

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


10176
2018-04-10 08:03


起源

整个问题都是基于错误的前提; container 没有推断出来。这是SFINAE。 wandbox.org/permlink/OGnCoxCqWapQeRxG - Baum mit Augen


答案:


怎么样 container 是在代码#1中推断出来的?

在模板参数推导过程中无法推导出因为 非推断的背景

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

那意味着你的 sort 那时候根本不会考虑重载决议 std::sort 被称为没有歧义。

代码#2没有这样的问题,你的 sort 和 std::sort 是有效的候选人然后导致模糊的重载错误。


14
2018-04-10 08:08