2013-03-11

テンプレートのstaticデータメンバーの明示的特殊化の宣言は、初期化子がない限り宣言にすぎない

テンプレートのstaticデータメンバーの明示的特殊化の宣言は、初期化子がない限り宣言にすぎない。また、デフォルト初期化する場合は、文法上の理由により、braced-init-listを使わなければならない。

template < typename T >
struct X
{
    static int data ;
} ;

// 宣言、定義ではない
template < >
int X<int>::data ; 

// エラー、関数int ()の宣言
template < >
int X<int>::data () ;

// 定義
template < >
int X<int>::data { } ;

今まで何故知らなかったのかと疑問に思ったが、そもそも、staticデータメンバーの明示的特殊化なんて使った覚えがない。使った覚えがない以上、知らないのも当然だ。

それにしても、braced-init-listのないC++03では、さぞやstaticデータメンバーの明示的特殊化のデフォルト初期化が面倒だったことだろう。いや、そもそもまず使われないか。

と、こんな些細なことまで解説しているC++の参考書。今年は何としても完成させなければ。

1 comment:

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.