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

时间:2017-06-13 16:11:37

标签: c++11 casting

我正在尝试理解这些代码行:

shouldComponentUpdate (nextProps) {
    const thisData = this.props.data.queryDataResponse;
    const nextData = nextProps.data.queryDataResponse;
    if (!someLibrary.deepEquals(thisData, nextData)) {
      return true;
    }else {
      return false;
    }
}

拜托,你能解释一下为什么标记的行不能编译吗?

此外,如果#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?它不应该用于投射物体吗?

1 个答案:

答案 0 :(得分:1)

  

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

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

来自cplusplus.com

  

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

     

因此,当我们将一个类转换为基类

时,dynamic_cast总是成功的

,而

  

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

  

const_cast 操纵对象的 constness ,要么设置要么被删除

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

  

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

     

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

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

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