テンプレートの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++の参考書。今年は何としても完成させなければ。
出版楽しみです。
ReplyDelete