代码之家  ›  专栏  ›  技术社区  ›  Anycorn

C++标准,超载函数解析/匹配

  •  7
  • Anycorn  · 技术社区  · 15 年前

    C++标准是否保证如下:

    template<typename T>
    void function(T (&)[1]);
    
    template<typename T>
    void function(T*);
    
    int a[1];
    function(a); // first function gets called, not second version
    
    1 回复  |  直到 15 年前
        1
  •  7
  •   jpalecek    15 年前

    是的,这是肯定的,但是原因和GMan说的不同。将选择“array of length 1”重载,因为它比模板函数偏序中的第二个重载更专业化。基本上,这意味着 T(&)[1] T* ,因此当转换序列不确定时,将始终选择第一个重载。

    从13.3.3开始:

    根据这些定义,一个可行的 函数F1被定义为一个更好的函数 如果对于所有参数i,ICSi(F1)为 ICSi(F2),然后

    • 对于某些参数j,ICSj(F1)是一个比j更好的转换序列 ICSj(F2),或者,如果不是,

    • F1和F2是模板函数,F1的函数模板是 比tem板更专业 14.5.5.2中描述的订购规则, 或者,如果不是这样,

    template <class T> void f(T);
    template <class T> void f(T*);
    

    否则对我来说是不明确的 int* . 在C++ 0x中,甚至可以编写声明:

    template <class ...Ts>           void f(const Ts&... args);
    template <class T, class ... Ts> void f(const T& a, const Ts&... args);