41737


以下のコードにおいて

[code]

    class hoge {
    };
    
    template<typename type_>
    class foo {
        class bar {
        };
        static bar static_member_;
    };
    template<typename type_> typename foo<type_>::bar foo<type_>::static_member_;
    
[/code]

`class foo<hoge>`を明示的インスタンス化します。

[code]

    template class foo<hoge>;
    
[/code]

以下のコマンドで`foo<hoge>::static_member_`がインスタンス化されているかを確認します。

[code]

    objdump --demangle -t hoge|grep static_member_
    
[/code]

以下の出力から`foo<hoge>::static_member_`がインスタンス化されていることが確認できました。  
`0000000000601029 u O .bss 0000000000000001 foo<hoge>::static_member_`

次に`class foo`を基底クラスとする`class derived`を考えます。

[code]

    template<typename type_>
    class derived :public foo<type_>
    {
    };
    // template class foo<hoge>;
    template class derived<hoge>;
    
[/code]

`class foo<hoge>`の明示的インスタンス化を削除して、`class derived<hoge>`を明示的インスタンス化します。  
同様に`foo<hoge>::static_member_`がインスタンス化されているか確認しましたが、インスタンス化されていませんでした。  
この結果から派生クラスの明示的インスタンス化をしても基底クラスはインスタンス化されないように見えます。  
**質問**  
テンプレートクラスの明示的インスタンス化構文を派生クラスに適用した場合、基底クラスまではインスタンス化されない。この挙動はC++の仕様でしょうか？

使用しているコンパイラは  
'gcc version 5.4.1 20160904 (Ubuntu 5.4.1-2ubuntu1~16.04)'  
です。


CC BY-SA 3.0
2018-02-15T02:01:43.897
41721
2018-02-15T11:57:29.350
7844
question
c++
基底クラスのスタティックメンバー変数がインスタンス化されない


> この挙動はC++の仕様でしょうか？

（おそらく）はい。

C++17言語仕様 §17.7.2 [temp.explicit]/paragraph 8 より引用：

> An explicit instantiation that names a class template specialization is also
> an explicit instantiation of the same kind (declaration or definition) of
> each of its members ( **not including members inherited from base classes
> and members that are templates** ) that has not been previously explicitly
> specialized in the translation unit containing the explicit instantiation,
> except as described below. [...]


CC BY-SA 3.0
2018-02-15T11:57:29.350
41737
2018-02-15T11:57:29.350
49
41721
answer