サンプルコード
#include <iostream>
struct base {};
template<typename Type>
struct left : base {
Type value;
};
template<typename Type>
struct right : base {
Type value;
};
int main() {
std::cout << "sizeof left<base> = " << sizeof(left<base>) << std::endl;
std::cout << "sizeof left<right<base>> = " << sizeof(left<right<base>>) << std::endl;
std::cout << "sizeof left<right<left<right<left<base>>>>> = " << sizeof(left<right<left<right<left<base>>>>>) << std::endl;
}
出力
GCC4.6では
sizeof left<base> = 2
sizeof left<right<base>> = 3
sizeof left<right<left<right<left<base>>>>> = 6
clang3.1を使用
sizeof left<base> = 2
sizeof left<right<base>> = 3
sizeof left<right<left<right<left<base>>>>> = 6
MSVC2012を使用
sizeof left<base> = 1
sizeof left<right<base>> = 1
sizeof left<right<left<right<left<base>>>>> = 1
それで、質問は、それがGCC / clangのバグなのか、それとも実装定義なのか、それとも正しい出力なのか(標準からの引用、またはそのような振る舞いの説明がいいでしょう)