Взять типичная демонстрация того, как значения указателя могут изменяться при приведении :
struct B1 { int x; };
struct B2 { int y; };
struct D : B1, B2 { };
int main() {
D d;
cout << (B1*)&d << " " << (B2*)&d << " " << &d;
}
// Typical output:
// 0xbf814ab4 0xbf814ab8 0xbf814ab4
Я задумался; это смещение, вероятно, не существует, когда B1
не имеет членов, поэтому я проверил и это правда (по крайней мере, в этом случае; не уверен, насколько это поведение гарантировано стандартами):
struct B1 { };
struct B2 { };
struct D : B1, B2 { };
int main() {
D d;
cout << (B1*)&d << " " << (B2*)&d << " " << &d;
}
// Typical output:
// 0xbf6ad95b 0xbf6ad95b 0xbf6ad95b
Но тогда sizeof(T)
не может быть 0
, поэтому sizeof(B1)
по-прежнему 1
.
Меня поражает, что это "несоответствие" может потенциально привести к серьезному подверженному ошибкам коду, когда программист предполагает, что (char*)(B2*)&d - (char*)(B1*)&d == (ptrdiff_t)sizeof(B1)
.
Является ли мой анализ точным?