c++ - 为什么两个模板函数的输出不同?
问题描述
为什么这两个模板功能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
,FuncTwo
给出了预期和正确的输出。但是为什么不FuncOne
给出相同的输出,因为它只是另一种写作方式FuncTwo
?
使用的编译器:g++ 7.1.0
解决方案
FuncOne
不是另一种写法FuncTwo
。如果你更换了这条线
auto a = reinterpret_cast<const volatile char &>(v);
经过
auto& a = reinterpret_cast<const volatile char &>(v);
否则 in 的引用将在 的类型推断期间const volatile char&
被删除。a
推荐阅读
- javascript - How to take image(s) when user happy and face detected using face-api
- java - 如何在连接表上构建 JPQL 查询?
- java - Java,打印列表中两个元素之和的代码不起作用
- r - 在基本 R 中对同一数据集执行相同操作时偶尔会出现数值问题
- arduino - 调用“”(Arduino)没有匹配的功能
- vue.js - babel.config.js babel eslint 关闭/禁用规则
- kotlin - MPAndroidChart,关于最大实际值的轴刻度
- go - 如何为服务器和事件句柄设计带有单独包的事件驱动 API?
- azure-active-directory - 图形 API(Http 状态:412 前提条件失败 - ErrorIrresolvableConflict)
- html - 如何基于另一个 html 页面建立一个 html 页面?