Topic: no base classes of the same type as the first non-static data member


Author: David Krauss <potswa@gmail.com>
Date: Sat, 15 May 2010 20:18:53 CST
Raw View
Is the last requirement of standard-layout classes, 9/6, necessary?

A footnote explanation is provided:

This ensures that two subobjects that have the same class type and
that belong to the same most-derived object are not allocated at the
same address (5.10).

Taken alone, the footnote is incorrect. Two empty base classes with a
common base class must produce two instances of the base class at the
same address.

struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};

D d;
static_cast<A*>(static_cast<B*>(&d))
   == static_cast<A*>(static_cast<C*>(&d)); // required

Taken in the context of 5.10, subobjects are only mentioned in the
comparison requirements of pointers to members. Base subobjects are
irrelevant.

There wasn't such a restriction in C++03. Moreover, it doesn't make
sense to give special status to comparison between a pointer to a
member subobject and a pointer to a base subobject above that of
comparison between pointers to base subobjects.

Even if there is an ABI out there that requires every member to be
allocated at a different address from any base of the same type, yet
already allows the empty base class optimization on the above code, I
think the ABI is buggy and the standard shouldn't capture this.

The language goes back to N2172
  http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2172.html#Revision-history
which suggests that multiple inheritance might cause trouble and need
to be disallowed to provide ABI compatibility
  http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2172.html#ABI
however, that was ultimately allowed and in that light the requirement
doesn't make sense.

--
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@netlab.cs.rpi.edu]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]