微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的指针的 static_cast 失败?

如何解决为什么我的指针的 static_cast 失败?

为什么我的指针的 static_cast 失败?

int iDog = 456;
int *piDog = &iDog;
long *plDog = static_cast<long*>(piDog); // invalid type conversion

long lDog = static_cast<long>(iDog);    // ok

long* plDog = (long*)(piDog); // this is OK too... very weird!! (Dynamic cast... and we aren't allowed to use this one in our coding standards)

这个参考表明它应该没问题:https://en.cppreference.com/w/cpp/language/static_cast

Visual Studio C++ 的问题?

解决方法

long *plDog = static_cast<long*>(piDog); // invalid type conversion

为什么我的指针的 static_cast 失败?

因为它的格式不正确。 static_cast 的任何规则都不适用于您正在尝试的演员表。正如您在评论中提到的,这是一个无效的转换。

指向一种对象类型的指针不能静态转换为指向另一种对象类型的指针,除非它们是指向相关类的指针,或者在转换为/从指向 void 的指针时。

这个参考表明它应该没问题:https://en.cppreference.com/w/cpp/language/static_cast

该参考资料表明您尝试的转换不正常

long* plDog = (long*)(piDog); // this is OK too... very weird!!

这是一个格式良好的转换。这并不“奇怪”。

有许多转换是显式转换(也称为“强制转换表示法”或“C 风格强制转换”)允许的,而静态强制转换则不允许。这是因为静态类型转换具有(至少在表面上)类型安全,而显式转换本质上要求编译器假装类型系统不存在。

请注意,通过 plDog 进行间接访问并访问对象会导致未定义的行为。如您所见,出现错误是一件好事。

我们不允许在我们的编码标准中使用这个

这是一个很好的限制。这将使您的团队更难通过错误地绕过类型系统来编写错误。

Visual Studio C++ 的问题?

不,问题是程序格式错误。编译器会正确地通知您有关该错误的信息,并且不需要编译程序。


我建议问问自己:你为什么想要,或者认为你需要做这样的演员?

,

TL;DR:如果您的转换有效,该语言将不会为指针提供类型安全保证,并且是引入 C++ 样式转换而不是坚持使用 C++ 风格转换的动机的关键部分老派 C 演员表。

在 C/C++ 标准的语言中,long*int* 不是“指针兼容的”。您不能将 long* 隐式转换为 int*,反之亦然,因此 static_cast 不能在一次转换中完成。

这背后的原因是,对于所有平台,sizeof(long) 并不总是等于 sizeof(int)。它们是不同的基本类型。这通常适用于所有不同的 C/C++ 类型,即使它们具有相同的二进制布局。如果在语言的语法中通过隐式转换将类型声明为相关,则它们才是“指针兼容的”。

当从 static_cast 转换为任何指向对象类型的指针时,您可以使用 void*,反之亦然。

因此,您可以通过两种方式执行此操作:

  • reinterpret_cast<long*>(piDog);

-或-

  • static_cast<long*>(static_cast<void*>(piDog));

在风格上,reinterpret_cast 的使用要清晰得多。无论哪种情况,转换的有效性都取决于体系结构,并假定 sizeof(int) == sizeof(long) 以及具有相同的内存布局。

IOW 这对于 Windows x86 和 x64 本机是安全的,但可能不适用于其他平台或 CPU。这是 Windows x64 选择使用 LLP64 中所述的 this blog post 数据模型的原因之一。

请参阅 static_castreinterpret_cast 的 cppreference

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。