了解C ++中的强制转换11

问题描述 投票:1回答:1

我试图理解这些代码行:

#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指针?它不应该用于投射物体吗?

c++11 casting
1个回答
1
投票

请问您能解释一下为什么标记的行不能编译?

您的代码未编译的原因是Foo和Bar是不相关的数据类型

来自cplusplus.com

dynamic_cast只能用于指针和对象的引用。其目的是确保类型转换的结果是所请求类的有效完整对象。

因此,当我们将类转换为其基类之一时,dynamic_cast总是成功的

static_cast可以执行指向相关类的指针之间的转换,不仅可以从派生类到其基类,还可以从基类到其派生类

const_cast操纵对象的常量,要么设置要么要删除

然而,reinterpret_cast是您使事情有效的唯一选择:

reinterpret_cast将任何指针类型转换为任何其他指针类型,甚至是不相关的类。操作结果是从一个指针到另一个指针的值的简单二进制副本。

允许所有指针转换:既不检查指向的内容,也不检查指针类型本身。

你的两个结构Foo和Bar之间没有任何关系,所以reinterpret_cast是这种情况下唯一可用的选择。

如果您查看我上面提到的链接,您将看到(在reinterpret_cast部分中)您提供的相同示例。

© www.soinside.com 2019 - 2024. All rights reserved.