我正在尝试实施更危险的reinterpret_cast。代码打击似乎不起作用。
#include<iostream>
#include<memory>
using namespace std;
template<typename TTo, typename TFrom>
TTo& horrible_cast(TFrom& from) {
static_assert(sizeof(TFrom) == sizeof(TTo), "");
union {
TFrom* from = &from; // error cannot convert
// from 'std::unique_ptr<int,std::default_delete<_Ty>> **'
// to 'std::unique_ptr<int,std::default_delete<_Ty>> *'
TTo* to;
};
return *to;
// return *reinterpret_cast<TTo*>(&from); this one works fine.
}
int main() {
unique_ptr<int> u{ new int(3) };
auto x = horrible_cast<int*>(u);
}
TFrom&
推断为unique_ptr<int>&
。但是当拿到它的地址时,它会给出一个unique_ptr<int>**
。我该如何解决呢?
我在8.1窗口使用Visual Studio 2017社区
答案 0 :(得分:1)
由于匿名联合,您收到了该错误。由于联合的成员被注入到周围的范围中,因此您有一个TFrom* from
变量,它会隐藏参考参数TFrom& from
。
所以你要在初始化器中获取指针的地址。因此整个双指针shenanigans。
除此之外,reinterpret_cast
已经足够危险了,所以我觉得你做这个更糟糕演员的工作是多余的。