首页 > 解决方案 > 为什么两个模板函数的输出不同?

问题描述

为什么这两个模板功能FuncOneFuncTwo输出不同?

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 

从比较 的值可以看出nbptrFuncTwo给出了预期和正确的输出。但是为什么不FuncOne给出相同的输出,因为它只是另一种写作方式FuncTwo

使用的编译器:g++ 7.1.0

标签: c++templatesautotype-deduction

解决方案


FuncOne不是另一种写法FuncTwo。如果你更换了这条线

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

经过

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

否则 in 的引用将在 的类型推断期间const volatile char&被删除。a


推荐阅读