I'm looking at the standard, and it appears that the following is
legal...
struct incomplete_t;
std::aligned_union<0, void, incomplete_t>::type
aligned_t;
Does anyone have any idea what the expected behavior of such code would
be? The comments in table 51 of the current draft say
template <std::size_t Len, class... Types>
struct aligned_union;
The member typedef type shall be a pod type suitable for
use as uninitialized storage for any object whose type is
listed in Types; its size shall be at least Len. The static
member alignment_value shall be an integral constant of
type std::size_t whose value is the strictest alignment
of all types listed in Types.
The problem is that void and incomplete types don't have a size or
alignment requirements. It appears that this is an oversight in the
standard. The related trait alignment_of<T> requires that T be a
complete type, a reference type, or an array of unknown bound, but not a
function type or cv-void type.
Now I could implement aligned_union<> to ignore incomplete types (they
have no alignment requirement), but this might cause problems if someone
tried to use the result.
Travis