38得票5回答
std::array是否与旧的C数组兼容?

一个 std::array<T,N> v 和一个 T u[N] 的底层位表示是否相同? 换句话说,从一个数组复制 N*sizeof(T) 字节到另一个数组是安全的吗?(无论是通过 reinterpret_cast 还是 memcpy。) 编辑: 为了澄清,重点在于 相同的位表...

37得票3回答
使用void*进行转换而不是使用reinterpret_cast

我正在阅读一本书,发现直接使用reinterpret_cast是不可以的,应该将其与static_cast配合使用,先转换为void*类型:T1 * p1=... void *pv=p1; T2 * p2= static_cast<T2*>(pv); 改为:T1 * p1=... ...

35得票2回答
为什么reinterpret_cast不能将int转换为int?

我使用的编译器是最新的 VC++ 2013 RC 版本。void f() { int n1 = 0; int n2 = reinterpret_cast<int>(n1); // error C2440 } 错误 C2440:“reinterpret_cast...

28得票2回答
将`T*`强制转换为`T(*)[N]`是否属于未定义行为?

考虑以下情景:std::array<int, 8> a; auto p = reinterpret_cast<int(*)[8]>(a.data()); (*p)[0] = 42; 这算是未定义行为吗?我认为是。a.data() 返回一个 int*,它和 int(*)[...

28得票6回答
C++是否被认为是弱类型语言?为什么?

我一直认为C ++是最强类型的语言之一。 因此,当看到本文第3表格指出C ++是弱类型时,我感到非常震惊。 显然, 由于类型转换,C和C ++被认为是弱类型,因为可以将结构体字段解释为整数指针。 是否只存在类型转换?这些显式转换的明确性是否不重要? 更普遍地说,C ++真的被普遍认为是弱类...

25得票3回答
将结构体别名为其第一个成员是否违反了严格别名规则?

示例代码:struct S { int x; }; int func() { S s{2}; return (int &)s; // Equivalent to *reinterpret_cast<int *>(&s) } 我认为这是常见...

25得票7回答
为什么我不能将uint重新解释为int?

这是我想要做的事情: ```const int64_t randomIntNumber = reinterpret_cast(randomUintNumber);``` 其中randomUintNumber的类型为uint64_t。 错误信息为(MSVC 2010): ``` erro...

24得票3回答
使用reinterpret_cast的示例,不会触发未定义行为。

阅读https://en.cppreference.com/w/cpp/language/reinterpret_cast,我想知道在实践中使用reinterpret_cast的非UB用例是什么? 上述描述包含许多情况,其中将指针转换为其他类型然后返回是合法的。但这似乎用处不大。通过rein...

22得票3回答
C++联合体 vs reinterpret_cast

从其他 StackOverflow 问题和阅读ISO/IEC C++ 标准草案的第9.5.1节可以看出,使用联合体进行数据的字面上的reinterpret_cast是未定义的行为。 考虑下面的代码。目标是将十六进制值0xffff直接解释为IEEE 754浮点数中的一系列位。(二进制转换可视化...

21得票5回答
reinterpret_cast大多数情况下是无用的吗?

我已经阅读了关于使用 reinterpret_cast 的各种之前的问题,并且也阅读了相关的 C++ 标准措辞。本质上,问题在于指针转换操作的 reinterpret_cast 结果不能安全地用于除了强制转换回原始指针类型之外的任何其他目的。 然而,在实践中,大多数对 reinterpret...