在这种情况下,静态强制转换不会增加安全性:void*
的静态强制转换与重新解释强制转换同样危险。实际上,重新解释类型转换是根据void*
进行类型转换定义的,因此示例在语法上几乎完全相同。
两个静态类型转换比单个重新解释类型转换更长,更难阅读。
,
仅供参考,在此示例中,您无需强制转换为const
。 GetBufferPointer()
返回非常量uint8_t*
,并且您可以将非常量char*
传递给ostream::write()
。可以将指向非常量的指针分配给指向const的指针,编译器将为您隐式应用const
。因此,一次强制转换就足够了,在这种情况下,需要reinterpret_cast
从uint8_t*
直接转换为char*
:
out.write(reinterpret_cast<char*>(fbBuilder.GetBufferPointer()),fbBuilder.GetSize());
,
双static_cast
等效于reinterpret_cast
:
https://en.cppreference.com/w/cpp/language/reinterpret_cast
5)任何对象指针类型T1 *都可以转换为另一个对象指针类型 cv T2 *。这完全等同于static_cast< cv T2*> (static_cast< cv void*> (expression))
(这意味着如果T2的对齐要求不严格于T1的对齐要求,则指针的值不会更改,并且将结果指针转换回其原始类型将产生原始值)。无论如何,只有在 type aliasing 规则允许的情况下,才能安全地取消对结果指针的引用(请参见下文)
在这种情况下,使用reinterpret_cast
是惯用的,例如,ostream::write()
的示例代码使用reinterpret_cast
:
https://en.cppreference.com/w/cpp/io/basic_ostream/write
#include <iostream>
int main()
{
int n = 0x41424344;
std::cout.write(reinterpret_cast<char*>(&n),sizeof n) << '\n';
char c[]="This is sample text.";
std::cout.write(c,4)<<'\n';
}
本文链接:https://www.f2er.com/2637149.html