【发布时间】:2018-02-18 18:36:35
【问题描述】:
API 使用void* 来存储无类型指针偏移量。这有点hacky,但没关系。
为了表达我的偏移算法,我尝试做这样的事情
int main ()
{
void * foo;
foo = static_cast <int *> (nullptr) + 100;
static_cast <int * &> (foo) += 100;
}
最后一行编译失败(gcc)
x.cpp:7:28: error: invalid static_cast from type ‘void*’ to type ‘int*&’
修复很简单:
foo = static_cast <int *> (foo) + 100;
但是为什么不允许第一个呢?
在你回答“因为标准这么说”之前,为什么标准这么说?第一种方法有什么危险吗?还是只是疏忽?
【问题讨论】:
-
理论上,不能保证
void*和int*的大小相同。作为左值,它们可能不兼容。虽然这在实践中是不可能的。 -
@liliscent:在实践中,
int*需要的位比void*少,因此虽然可能很少见,但它们实际上是不同的大小并非不可能(相对于有几个未使用/填充位在int*)