C++ 两个静态的\u cast比重新解释\u cast好吗?

C++ 两个静态的\u cast比重新解释\u cast好吗?,c++,casting,flatbuffers,C++,Casting,Flatbuffers,我使用flatbuffers,需要将数据写入文件。Flatbuffer结构返回uint8_t*,但std::ofstream::write将char*作为参数。 你能告诉我哪种方法使用两个静态类型转换或重新解释类型转换更好,为什么 flatbuffers::FlatBufferBuilder fbBuilder // flatbuffer structer ... // write something to fbBuilder std::ofstream out(fil

我使用flatbuffers,需要将数据写入文件。Flatbuffer结构返回uint8_t*,但std::ofstream::write将char*作为参数。 你能告诉我哪种方法使用两个静态类型转换或重新解释类型转换更好,为什么

    flatbuffers::FlatBufferBuilder fbBuilder // flatbuffer structer 
    ... // write something to fbBuilder
    std::ofstream out(filename);
    // this
    out.write(static_cast<const char*>(static_cast<const void*>(fbBuilder.GetBufferPointer())), fbBuilder.GetSize());
    // or this ? 
    out.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer())), fbBuilder.GetSize());

在这种情况下,静态强制转换不会增加安全性:来自void*的静态强制转换与重新解释强制转换一样危险。事实上,reinterpret cast是根据void*中的强制转换定义的,因此除了语法之外,所有示例实际上都是相同的

两个静态类型转换比单个reinterpret类型转换更长、更难读取。

双静态类型转换相当于reinterpret类型转换:

5任何对象指针类型T1*都可以转换为另一个对象指针类型cv T2*。这完全等同于static_caststatic_cast表达式,这意味着如果T2的对齐要求不比T1严格,指针的值不会改变,并且将结果指针转换回其原始类型会产生原始值。在任何情况下,只有在类型别名规则(见下文)允许的情况下,才能安全地解除对结果指针的引用

在本例中使用reinterpret_cast是惯用的,例如,ostream::write的示例代码使用reinterpret_cast:

包括 int main { int n=0x41424344;
std::cout.writereexploration_cast&n,sizeof nFYI,在本例中,您不需要强制转换为常量。GetBufferPointer返回一个非常量uint8_t*,您可以将一个非常量char*传递给ostream::write。可以将指向非常量的指针分配给指向常量的指针,编译器将为您隐式应用常量。因此,一次强制转换就足够了e、 在这种情况下,需要重新解释从uint8\u t*到char*的转换:

out.writereexploration\u castfbBuilder.GetBufferPointer,fbBuilder.GetSize;
投票以基于意见的方式结束。依我看,最好明确说明您的意图并使用reinterpret\u cast。双重静态\u cast看起来像是代码分析器的一个解决办法,它警告reinterpret\u cast的使用。reinterpret\u cast最好避免。@Ron,对于写入文件和读取文件,reinterpret\u cast是合适的。我个人认为使用reinterpret_cast。标准中有一种明确的语言,当使用char*时,您可以迭代对象的by,所以这是执行此操作的标准方法。