假设我想将A*
转换为char*
,反之亦然,我们有两种选择(我的意思是,很多人认为我们有两种选择,因为两者似乎都可以工作!这就是混淆所在!):
struct A
{
int age;
char name[128];
};
A a;
char *buffer = static_cast<char*>(static_cast<void*>(&a)); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
两种方式都可以正常工作。
//convert back
A *pA = static_cast<A*>(static_cast<void*>(buffer)); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
即使这样也可以正常工作!
那么,既然在C++中两个链接的static_cast
就能完成reinterpret_cast
的工作,为什么还需要reinterpret_cast
呢?
你们中的一些人可能会认为这个话题是先前主题的副本,例如此帖子底部列出的那些主题,但事实并非如此。那些主题只讨论理论问题,但它们中没有一个例子能够说明为什么真正需要reinterpret_cast
,以及为什么static_cast
至少需要两次才能达到目标。 我同意,一次static_cast
是不够的。 但是两次呢?
如果两个链接的static_cast
语法看起来很麻烦,那么我们可以编写一个函数模板来使其更加友好:
template<class To, class From>
To any_cast(From v)
{
return static_cast<To>(static_cast<void*>(v));
}
然后,我们可以这样使用:
char *buffer = any_cast<char*>(&a); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
//convert back
A *pA = any_cast<A*>(buffer); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
此外,请参见这种情况,any_cast
可以很有用:Proper casting for fstream read and write member functions。那么我的问题基本上是,
- 为什么C++中有
reinterpret_cast
? - 请给我展示一个例子,即使是两个链接在一起的
static_cast
,也肯定无法完成相同的工作?
T*
且地址为8的指针(用于这个技巧http://stackoverflow.com/questions/5014061/whats-the-use-of-atl-packing-constant-when-computing-distance-from-the-start-of) - 我该如何使用static_cast
实现? - sharptoothstatic_cast
无法完成reinterpret_cast
的工作。 - Nawazany_cast
,因为它的名称具有误导性。如果你从类型pointer-to-A
转换到pointer-to-B
,它会做得很好,但并非所有情况都适用(“任何”情况)。 - 0xbadf00d