让我们不要讨论以下代码的坏处,它不是我的,我提前完全同意你的看法,它并不漂亮,而是 C-ish 并且可能非常危险:
void * buf = std::malloc(24 + sizeof(int[3]));
char * name = reinterpret_cast<char *>(buf);
std::strcpy(name, "some name");
int * values = reinterpret_cast<int *>(name + 24);
values[0] = 0; values[1] = 13; values[2] = 42;
它的意图很明确;它是一个“字节块”,存储两个不同类型的数组。要访问不在块前面的元素,它将块解释为
char *
并将指针递增sizeof(type[len])
.
但是,我的问题是,它是否合法 C++(11),如“是否保证它可以在每个符合标准的编译器上工作”?我的直觉说不是,但是 g++ 和 clang 似乎很好。
我将不胜感激对此的标准报价;不幸的是,我自己找不到相关的段落。