从C标准:
标准布局类是一个类: - 没有类型非标准布局类(或此类类型的数组)或引用的非静态数据成员, - 没有虚函数(10.3)且没有虚基类(10.1), - 对所有非静态数据成员具有相同的访问控制(第11条), - 没有非标准布局基类, - 在最派生类中没有非静态数据成员,并且最多一个具有非静态数据成员的基类,或者没有带有非静态数据成员的基类,并且 - 没有与第一个非静态数据成员相同类型的基类宏offsetof(type,member-designator)在本国际标准中接受一组受限制的类型参数 . 如果type不是标准布局类(第9节),则结果是未定义的
考虑到这些陈述是否有任何安全的方法使用 offsetof 依赖于模板参数的成员?如果没有,我怎样才能获得模板类中成员的偏移量?使用类似以下内容时可能不安全:
//MS Visual Studio 2013 definition
#define offsetof(s,m) (size_t)&reinterpret_cast((((s *)0)->m))
在非标准布局类?
根据标准,样品不安全的样品:
#include
#include
template
struct Test
{
int a;
T b;
};
struct NonStdLayout
{
virtual void f(){};
};
int main()
{
std::cout << offsetof(Test, b) << std::endl;
std::cout << offsetof(Test, b) << std::endl;
return 0;
}