假设我想将 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
即使这样也能正常工作!
那么,当两个链式 static_cast
可以完成它的工作时,为什么我们在C++ 中有reinterpret_cast
?
你们中的一些人可能会认为此主题与之前的主题(例如本文底部列出的主题)重复,但事实并非如此。这些主题仅在理论上进行讨论,但都没有给出一个示例,说明为什么确实需要 reintepret_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
肯定无法完成相同工作的示例?
最佳答案
reinterpret_cast
可以做一些 static_cast
序列无法做到的事情(全部来自 C++03 5.2.10):
指针可以显式转换为任何大到足以容纳它的整数类型。
整数类型或枚举类型的值可以显式转换为指针。
指向函数的指针可以显式转换为指向不同类型函数的指针。
类型为“
T1
类型的X
成员的指针”类型的右值可以显式转换为“指向的成员的指针”类型的右值>Y
of typeT2
"如果T1
和T2
都是函数类型或都是对象类型。
另外,从 C++03 9.2/17 开始:
- 一个指向 POD-struct 对象的指针,使用
reinterpret_cast
进行适当转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元)反之亦然。
关于c++ - 当两个链接的 static_cast 可以完成它的工作时,为什么我们在 C++ 中有 reinterpret_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5025843/