基底クラスのスタティックメンバー変数がインスタンス化されない
以下のコードにおいて
class hoge {
};
template<typename type_>
class foo {
class bar {
};
static bar static_member_;
};
template<typename type_> typename foo<type_>::bar foo<type_>::static_member_;
class foo<hoge>
を明示的インスタンス化します。
template class foo<hoge>;
以下のコマンドでfoo<hoge>::static_member_
がインスタンス化されているかを確認します。
objdump --demangle -t hoge|grep static_member_
以下の出力からfoo<hoge>::static_member_
がインスタンス化されていることが確認できました。
0000000000601029 u O .bss 0000000000000001 foo<hoge>::static_member_
次にclass foo
を基底クラスとするclass derived
を考えます。
template<typename type_>
class derived :public foo<type_>
{
};
// template class foo<hoge>;
template class derived<hoge>;
class foo<hoge>
の明示的インスタンス化を削除して、class derived<hoge>
を明示的インスタンス化します。
同様にfoo<hoge>::static_member_
がインスタンス化されているか確認しましたが、インスタンス化されていませんでした。
この結果から派生クラスの明示的インスタンス化をしても基底クラスはインスタンス化されないように見えます。
質問
テンプレートクラスの明示的インスタンス化構文を派生クラスに適用した場合、基底クラスまではインスタンス化されない。この挙動はC++の仕様でしょうか?
使用しているコンパイラは
'gcc version 5.4.1 20160904 (Ubuntu 5.4.1-2ubuntu1~16.04)'
です。