有人可以向我解释为什么offsetof
函数对std :: vectors不起作用,如下所示:
#include <windows.h>
#include <iostream>
#include <vector>
using namespace std;
struct FooStruct {
double x;
double y[10];
std::vector<double> z;
};
int main() {
cout << offsetof(FooStruct, x) << endl;
cout << offsetof(FooStruct, y[2]) << endl;
cout << offsetof(FooStruct, z[2]) << endl;
system("Pause");
}
调用offsetof(FooStruct, z[2])
会产生以下编译错误:
cannot apply 'offsetof' when 'operator[]' is overloaded
答案 0 :(得分:2)
offsetof(FooStruct, z[2])
毫无意义。 z
中的元素不包含在FooStruct
中,它们是通过std::vector
访问的,z[2]
的核心是指向堆上其他一些分配的指针std::vector
可以找到。
在任何情况下,错误(我理解似乎令人困惑)都可能会弹出,因为operator[]
重载class FooStruct
,而不是因为operator[]
重载z[2]
(其中,假设我们看到整个定义,它没有。)
如果您想找到z[0]
相对于&z[0]
的偏移量,您可以像这样计算&z[2]
和std::cout << (&z[2] - &z[0]) << '\n';
之间的差异:{{1} }
答案 1 :(得分:1)
因为offsetof
不是函数而是宏,只适用于POD类型或C ++ 11中的标准布局类。它仅用于向后兼容C。
编译器拒绝允许您使用订阅运算符的原因,除了所有问题之外,原因是宏在编译时进行了计算,但重载的运算符可能会在运行时执行一些工作来计算结果。