繁体   English   中英

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

[英]Why is my static_cast of a pointer failing?

为什么我的指针的 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 的任何规则都不适用于您正在尝试的演员表。 正如您在评论中提到的,这是一个无效的转换。

指向一个 object 类型的指针可能不会被转换为指向另一个 object 类型的指针的 static,除非它们是指向相关类的指针,或者在转换到/从指针到 void 时。

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

该参考表明您尝试的转换不正确

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

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

显式转换(也称为“转换表示法”或“C 样式转换”)允许进行许多转换,而 static 转换则不允许。 这是因为 static 类型转换具有(至少是类似的)类型安全性,而显式转换本质上要求编译器假装类型系统不存在。

请注意,通过plDog间接访问并访问 object 将导致未定义的行为。 正如你所看到的,你得到了错误是一件好事。

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

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

Visual Studio C++ 有问题吗?

不,问题是程序格式不正确。 编译器正确地通知您错误,并且不需要编译程序。


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

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

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

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

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

因此,您可以通过两种方式做到这一点:

  • reinterpret_cast<long*>(piDog);

-或者-

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

从风格上讲, reinterpret_cast的使用更加清晰。 在任何一种情况下,强制转换的有效性都取决于架构,并假设sizeof(int) == sizeof(long)以及具有相同的 memory 布局。

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

请参阅 cppreference 了解static_castreinterpret_cast

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM