gcc 4.7.1は、タプルの空の基本クラスの最適化を行います。これは、非常に便利な機能だと思います。ただし、これには予期しない制限があるようです。
#include <tuple>
#include <cstdint>
#include <type_traits>
class A { };
class B : public A { std::uint32_t v_; };
class C : public A { };
static_assert(sizeof(B) == 4, "A has 32 bits.");
static_assert(std::is_empty<C>::value, "B is empty.");
static_assert(sizeof(std::tuple<B, C>) == 4, "C should be 32 bits.");
この場合、タプルは実際には4バイトより大きいため、最後のアサーションは失敗します。クラス階層を壊さずにこれを回避する方法はありますか?または、他の方法でこの場合に最適化する独自のペア実装を実装する必要がありますか?