我正在尝试理解这些代码行:
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
?它不应该用于投射物体吗?
答案 0 :(得分:1)
请你解释一下为什么标记的行不能编译?
您的代码未编译的原因是Foo和Bar是不相关的数据类型
dynamic_cast 只能用于指针和对象的引用。其目的是确保类型转换的结果是所请求类的有效完整对象。
因此,当我们将一个类转换为基类
时,dynamic_cast总是成功的
,而
static_cast 可以执行指向相关类的指针之间的转换,不仅可以从派生类到其基类,还可以从基类到其派生
和
const_cast 操纵对象的 constness ,要么设置要么被删除
然而, reinterpret_cast 是让事情有效的唯一选择:
reinterpret_cast 将任何指针类型转换为任何其他指针类型,甚至是不相关的类。操作结果是从一个指针到另一个指针的值的简单二进制副本。
允许所有指针转换:既未检查指向的内容,也未检查指针类型本身。
你的两个结构Foo和Bar之间没有任何关系,所以在这种情况下, reinterpret_cast 是唯一可用的选择。
如果您查看我上面提到的链接,您会看到(在reinterpret_cast部分中)您提供的相同示例。