我试图理解这些代码行:
#include <iostream>
using namespace std;
struct Foo {};
struct Bar {};
int main()
{
Foo* f = new Foo;
Bar* b1 = f; //error
Bar* b2 = static_cast<Bar*>(f); //error
Bar* b3 = dynamic_cast<Bar*>(f); //error
Bar* b4 = reinterpret_cast<Bar*>(f);
Bar* b5 = const_cast<Bar*>(f); //error
return 0;
}
拜托,你能解释一下为什么标记的行不能编译吗?
另外,如果reinterpret_cast
被设计用于处理指针,你为什么要使用static_cast
指针?它不应该用于投射物体吗?
请问您能解释一下为什么标记的行不能编译?
您的代码未编译的原因是Foo和Bar是不相关的数据类型
dynamic_cast只能用于指针和对象的引用。其目的是确保类型转换的结果是所请求类的有效完整对象。
因此,当我们将类转换为其基类之一时,dynamic_cast总是成功的
而
static_cast可以执行指向相关类的指针之间的转换,不仅可以从派生类到其基类,还可以从基类到其派生类
和
const_cast操纵对象的常量,要么设置要么要删除
然而,reinterpret_cast是您使事情有效的唯一选择:
reinterpret_cast将任何指针类型转换为任何其他指针类型,甚至是不相关的类。操作结果是从一个指针到另一个指针的值的简单二进制副本。
允许所有指针转换:既不检查指向的内容,也不检查指针类型本身。
你的两个结构Foo和Bar之间没有任何关系,所以reinterpret_cast是这种情况下唯一可用的选择。
如果您查看我上面提到的链接,您将看到(在reinterpret_cast部分中)您提供的相同示例。