gpt4 book ai didi

c++ - 如何评估指针和reinterpret_cast?

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:31 24 4
gpt4 key购买 nike

我有以下在 Visual Studio 中运行的代码。 c的地址与pa指向的地址相同,但与pb的地址不同。然而,这两个三元运算符都将评估为 true,这是仅查​​看代码而在调试器中看不到 pa 和 pb 的指向地址时所期望的结果。第三个三元运算符的计算结果为 false

#include <iostream>

class A
{
public:
A() : m_i(0) {}

protected:
int m_i;
};

class B
{
public:
B() : m_d(0.0) {}

protected:
double m_d;
};

class C
: public A
, public B
{
public:
C() : m_c('a') {}

private:
char m_c;
};

int main()
{
C c;
A *pa = &c;
B *pb = &c;

const int x = (pa == &c) ? 1 : 2;
const int y = (pb == &c) ? 3 : 4;
const int z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb)) ? 5 : 6;

std::cout << x << y << z << std::endl;

return 0;
}

这是如何工作的?

最佳答案

papb 其实是不一样的。一种测试方法是:

reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb)

pa == &cpb == &c 都返回 true,但这并不意味着上面的一定是 true &c 将通过隐式指针转换转换为适当的指针类型(A*B*)。此转换将指针的值更改为 &c 指向的对象的相应基类子对象的地址。

来自 cppreference :

A prvalue pointer to a (optionally cv-qualified) derived class type can be converted to a prvalue pointer to its accessible, unambiguous (identically cv-qualified) base class. The result of the conversion is a pointer to the base class subobject within the pointed-to object. The null pointer value is converted to the null pointer value of the destination type.

(强调我的)


AC的第一个非虚基类,所以直接放在C的内存空间的开头,即:

reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(&c)

。但是,B子对象布局在A之后,不可能满足上述条件。隐式转换和 static_cast 都会为您提供基本子对象的正确地址。

关于c++ - 如何评估指针和reinterpret_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35572862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com