Unrestricted unions

Interview questions are like memes. Recently on the technical interview circuit, the question "How does one programmatically determine endian-ness?" has been making the rounds. The value of such a question is frequently debated, but it involves today's topic, the stepchild of data structures, the union.

One answer to the question can be put this way:

union X {
  char c;
  int i;
  X(void) : i(1) { };
  bool isBig(void) { return !!c; }; 
} x;
 ..
cerr << (x.isBig() ? "big" : "little");

The standard describes the union as being like the struct with the exception that "at most one non-static data member is active at a time," a description that strikes me as more circuitous than simply saying all ordinary members are at the same address.(**) There is the further restriction that members of the union must have only trivial constructors(++); the implication is that you may not have a member that is a user defined type that requires the constructor to have parameters.

The proffered reason was an insurance policy that the union's contents were well formed. But let's ask ourselves: "When you are not being being asked interview brainteasers, how often outside the hardware/firmware environment do you use the union?"

The change to the C++11 standard loosened the safety belts and discarded the airbags. With the exclusion of reference types (a reference has no address, much less the same one as another object in the program), you may now toss in whatever you like.

(**) It is really easy to overlook the soon-to-be-interview-circuit-brainteaser that unions may have an unlimited number of arbitrarily complex static members each of which most definitely has its own unique address. File this under ...

(++) The standard used to say that they "may not have non-trivial" constructors, which similarly is a circuitous, double negation, near-pleonasm.