为什么我的指针的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++ 的问题?

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


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


以上是为什么我的指针的static_cast失败?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>