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?