【发布时间】:2011-02-06 13:10:07
【问题描述】:
据我了解 5.2.9 静态转换中的措辞,唯一允许 void*-to-object-pointer 转换的结果是 void* 是第一名。
在整个标准中,有一堆对指针表示的引用,void 指针的表示与 char 指针的表示相同,依此类推,但似乎从未明确假设强制转换一个任意的void 指针会产生一个指向内存中相同位置的指针,但类型不同,就像类型双关是未定义的,而不是双关回到对象的实际类型。
因此,虽然malloc 清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。
【问题讨论】:
-
一个得到很好接受答案的相关问题:stackoverflow.com/questions/1863069/…
-
我希望有一个更明确的答案,涉及更少的解释和挥手。毕竟,
static_cast应该比推理reinterpret_cast更简单。 -
我怀疑是否有更少“挥手”和解释的答案(不确定您所说的“挥手”是什么意思)。 Stadnard有时很少有故意的绝对保证。这暗示
static_cast<nonvoid*>(voidptr)只是工作并产生原始值,没有明确的措辞。实现没有理由更改该值,但标准也没有明确禁止它。想要表现得怪异的实现已经被允许在最简单的事情上崩溃(超过实现限制)。 -
@JohannesSchaub-litb "只是工作并产生原始值,没有明确的措辞" "对象指针类型的值转换为“指向 cv void 的指针”并返回,可能具有不同的 cv 限定,应具有其原始值。”
标签: c++ malloc language-lawyer static-cast object-lifetime