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

模板参数的引用变量导致的问题

  •  4
  • Sadeq  · 技术社区  · 14 年前

    template<class T> struct X
    {
        static void xxx(T& x) { }
        static void xxx(T&& x) { }
    };
    
    int main(int argc, char** argv)
    {
        int x = 9;
        X<int>::xxx(x); // OK.
        X<int&>::xxx(x); // ERROR!
        return 0;
    }
    

    错误消息(GCC):


    为什么? T = int& T& int&& 在里面 static void xxx(T& x) ?

    • T&
    • 以下代码应该起作用:

    但事实并非如此:

    template<class T> struct X
    {
        static void xxx(T& x) { }
    };
    
    int main(int argc, char** argv)
    {
        X<int&>::xxx(2); // ERROR!
        return 0;
    }
    

    错误:对X::xxx(int)的调用没有匹配的函数

    那么 T& 具有 T=积分; 不等于 T&& 不是右值引用。但如果不是,为什么第一个例子不起作用?(这是一个递归问题!)


    但指针类型没有出现类似的问题:

    #include <iostream>
    
    template<class T> struct X
    {
        static void xxx(T* x) { std::cout << **x << std::endl; }
    };
    
    int main(int argc, char** argv)
    {
        int x = 10;
        int* xx = &x;
        X<int*>::xxx(&xx); // OK. call X<int*>::xxx(int**)
        return 0;
    }
    

    为什么在这种行为中引用是不同的?

    1 回复  |  直到 12 年前
        1
  •  10
  •   Community gkalpak    4 年前

    如果是typedef 模板参数 TR 这是对类型的引用 T ,

    • TR公司 “创建类型”左值引用 T型 "
    • 尝试创建类型“rvalue reference to” TR公司 “创建类型

    让我们考虑一下你的例子(我已经将你的 TR公司 所以它符合上面的语言):

    template<class TR> struct X
    {
        static void xxx(TR& x)  { }
        static void xxx(TR&& x) { }
    };
    

    如果我们尝试实例化 X 具有 TR = int& T = int ),的实例化 xxx 具体如下:

    static void xxx(TR& x)  { }   -->   static void xxx(int& x) { }
    static void xxx(TR&& x) { }   -->   static void xxx(int& x) { }
    

    在第一种情况下,我们尝试创建一个“左值引用” ,这将成为 T型 ." T型 int ,因此参数类型变为 int& .

    TR公司 ,“变成 ,即 .

    两个重载的参数类型相同,因此会出现错误。