获取成员变量的大小

时间:2018-07-30 15:54:49

标签: c++ c++14 language-lawyer c++98

g ++-4.1及之前的一个错误使它成为reject the following valid program

struct S { int n; };
unsigned long long f() { return sizeof S::n; }
    // ^--g++-4.1 "error: invalid use of non-static data member 'S::n'"
int main() {}

我需要编写可移植的代码以使用该旧版本的g ++进行编译(除其他外),因此我想到了the following

#define sizeofmember(type, member) sizeof(static_cast<type*>(0)->member)
unsigned long long f() { return sizeofmember(S,n); }

由于以下原因,我知道精心制作的type* NULL指针不会被取消引用:

  

[expr.sizeof]/1

     

sizeof运算符产生其操作数类型[...]占用的字节数。操作数可以是一个表达式,它是一个未求值的操作数([expr.prop]),或者是带括号的type-id。

     

[expr.context]/1

     

在某些情况下,出现未求值的操作数([expr.prim.req],[expr.typeid],[expr.sizeof],[expr.unary.noexcept],[dcl.type .simple],[temp])。未评估的操作数不评估。 [注意:在未求值的操作数中,可以将非静态类成员命名为[[expr.prim.id]),而对象或函数的命名本身并不要求定义为提供([basic.def.odr])。未评估的操作数被视为完整表达式。 — 尾注]

但是有效吗?从C ++ 98到C ++ 14?

0 个答案:

没有答案