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

时间:2018-04-10 08:03:24

标签: c++ templates language-lawyer c++17 argument-dependent-lookup

代码#1

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

    <suite name="example suite 1" verbose="1" parallel="false" >
    <test name="Regression suite 1" preserve-order="true" >
      <classes>
        <class name="AppLaunch"/>
        <class name="Login">  
          <methods>
             <include name="Method1"/>
             <include name="Method2"/>    
          </methods>
         </class>
       <class name="SearchAccount"/>
       <class name="LogOut"/>
       <class name="Login">
         <methods>
            <include name="Method3"/>     
         </methods>
       </class>
     </classes>
   </test>
 </suite>

Wandbox

代码说明

它将调用ADL找到的#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()); } 函数。虽然代码如下:

代码#2

std::sort

Wandbox

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

问题

  1. 如何在代码#1中推断#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()); }

    据我所知,模板实例化期间的类型推导无法回溯成员类型以找到封闭的(在这种情况下为container)。

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

1 个答案:

答案 0 :(得分:14)

  

如何在代码#1中推断container

由于non-deduced context

在模板参数推断期间无法推断出
  

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

这意味着您的sort根本不会考虑重载解析,然后调用std::sort而不会产生歧义。

代码#2没有此类问题,sortstd::sort都是有效的候选人,然后会导致模糊的重载错误。