invalid offsetof from non-POD type

Matt Austern austern@apple.com
Mon Apr 28 18:59:00 GMT 2003


On Sunday, April 27, 2003, at 03:57 AM, Matthias Benkmann wrote:

> On Sat, 26 Apr 2003 11:44:59 +0100 Nathan Sidwell
> <nathan@codesourcery.com> wrote:
>
>> Matthias Benkmann wrote:
>>
>>> Can't you wrap the POD-stuff in a real POD like this:
>> yes, but then you (well I've had to in the past), do something like
>>
>> class Foo {
>> 	public:
>> 	struct Pod { ...};
>> 	...
>> };
>>
>> class BiggerFoo : public Foo {
>> 	public
>> 	struct Pod : Foo::Pod { ... }; // this is a lie now
>> 	...
>> };
>>
>> It gets annoying to have to write
>> 	struct Pod { struct Foo::Pod base; ... };
>> as that exposes the hierachy to all BiggerFoo::Pod users.
>
> Doesn't inheritance always yield a non-POD? So this wouldn't even work
> with offsetof, would it?

I've got three claims about this discussion.

First, it's happening in the wrong place.  We don't want to be changing 
the language the g++ accepts from C++ to something else.  If C++98's 
restrictions on offsetof are too restrictive, then we should be having 
a discussion on the standards committee reflector to have those 
restrictions loosened in C++0x.  At present g++ is already pretty 
lenient: all we're doing  is issuing a warning.  We shouldn't be 
silencing that warning.  Users ought to be warned when they're doing 
something that's explicitly forbidden by the language standard.  I 
would strongly oppose any change to this in our compiler until we've 
brought up the issue with the standards committee.  We do not want 
half-specified language extensions.

Second, we should be careful about which restrictions we think are too 
loose and which are too tight.  The C++ standard gives implementers a 
lot of freedom about object layout, even if g++ doesn't use all of that 
freedom.  For example, imagine an implementation in which all base 
classes, not just virtual bases, are accessed through a pointer.  (For 
extra credit, imagine why an implementation like that might even be 
useful.)

Third, I do agree that POD is too restrictive a criterion.  It comes 
closer to what we want than other concepts we've already got in the 
language standard, which was probably why it was chosen: nobody wanted 
to come up with a new concept just for offsetof.  But that's just 
standardization technicality.  If we think it's worth the effort, I'm 
sure it's possible to define things more precisely.

			--Matt



More information about the Gcc mailing list