代码之家  ›  专栏  ›  技术社区  ›  P.W

为什么两个模板函数的输出不同?

  •  0
  • P.W  · 技术社区  · 6 年前

    为什么这两个模板函数 FuncOne FuncTwo 输出不同?

    template <class T>
    T * FuncOne(T & v)
    {
        auto a = reinterpret_cast<const volatile char &>(v);
        auto b = & const_cast<char&>(a);
        auto c = reinterpret_cast<T *>(b);
        return c;    
    }
    
    template <class T>
    T * FuncTwo(T & v)
    {
        return reinterpret_cast<T *>(& const_cast<char&> (reinterpret_cast<const volatile char &>(v)));
    }
    

    测试这两个功能的代码:

    int main()
    {       
      nonaddressable na;
      nonaddressable * naptr = FuncOne(na); 
      cout << "FuncOne: naptr = " << naptr << endl;
      naptr = FuncTwo(na); 
      cout << "FuncTwo: naptr = " << naptr << endl;
    
      nonaddressable * nbptr = new nonaddressable;
      cout << "Address of nbptr = " << nbptr << endl;  
      cout << "FuncOne: nbptr = " << FuncOne(*nbptr) << endl; 
      cout << "FuncTwo: nbptr = " << FuncTwo(*nbptr) << endl;
    }
    

    样本输出:

    FuncOne: naptr = 0x61fddf   
    FuncTwo: naptr = 0x61fe2f   
    
    Address of nbptr = 0x7216e0   
    FuncOne: nbptr = 0x61fddf   
    FuncTwo: nbptr = 0x7216e0 
    

    从比较 nbptr , 函数二 给出预期和正确的输出。但为什么不 函数子 输出与另一种写作方式相同 函数二 ?

    使用的编译器:g++7.1.0

    1 回复  |  直到 6 年前
        1
  •  4
  •   Tobi    6 年前

    FuncOne 不是另一种写作方式 FuncTwo . 如果你把电话换了

     auto a = reinterpret_cast<const volatile char &>(v);
    

    通过

     auto& a = reinterpret_cast<const volatile char &>(v);
    

    否则引用 const volatile char& 将在 type-deduction 对于 a .