这个问题是关于使用带有结构偏移的指针算术派生的指针。
考虑以下程序:
#include <cstddef>
#include <iostream>
#include <new>
struct A {
float a;
double b;
int c;
};
static constexpr auto off_c = offsetof(A, c);
int main() {
A * a = new A{0.0f, 0.0, 5};
char * a_storage = reinterpret_cast<char *>(a);
int * c = reinterpret_cast<int *>(a_storage + off_c));
std::cout << *c << std::endl;
delete a;
}
该程序似乎可以使用默认设置和 C++11 标准在我测试的编译器上运行并给出预期的结果。
(一个密切相关的程序,我们使用void *
而不是char *
和static_cast
代替reinterpret_cast
,并没有被普遍接受。gcc 5.4
发出关于使用 void 指针的指针算术的警告,并clang 6.0
说指针算术 withvoid *
是一个错误。)
该程序是否具有根据 C++ 标准明确定义的行为?
答案是否取决于实现是否具有宽松或严格的指针安全性([basic.stc.dynamic.safety]
)?