0

有人可以向我解释为什么该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

4

2 回答 2

2

offsetof(FooStruct, z[2])没有意义。的元素z不包含在 aFooStruct中,它们是通过 访问的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';

于 2013-05-06T03:33:49.840 回答
1

因为offsetof不是函数而是宏,并且仅适用于 POD 类型或 C++11 中的标准布局类。它只是为了与 C 向后兼容。

编译器拒绝允许您使用订阅运算符的原因,抛开所有问题,是因为宏是在编译时评估的,但重载的运算符可能会在运行时做一些工作来计算结果。

于 2013-05-06T03:31:43.080 回答