templateでゴリゴリ書いていた頃に戻りたい

C++ ポケットリファレンス

C++ ポケットリファレンス

 そろそろC++11はきっちりコード書けるようになってないとなーと思って、C++ ポケットリファレンスを買ったところ、頭の体操にいい話題があったので。


 某界隈では有名なゆーむPの「スタティック const 整数データ メンバ以外をクラス内で初期化することはできません」を読んで、ふとclangだとどうなるんだろうと思って

clang -o test test.cpp

としたところ、以下のWarningが発生。

test.cpp:2:38: warning: in-class initializer for static data member of type 'const float' is a GNU extension [-Wgnu]
class A { public: static const float a = 1.0; };
                                     ^   ~~~
1 warning generated.


 なるほどgccの場合問題なくコンパイルできるのは、const floatのstatic data memberの初期化がGNU拡張だということなのね。clang親切やね。念のため「static const float」ぐらいでググると同じような悩みを持つ人がたくさんいるようで。例に上げるとStackOverflowでも疑問を投げてる人がいて、解答が「規格で決まってるから」というぐうの音も出ない解答。


 C++11の場合だと件の問題はconstexpr指定子をつけてコンパイル時定数にすれば解決するようですが、最近のコンパイラじゃないと無理ですな。なおclangは-std=c++11とすれば上記test.cppのコードに対して、constexpr指定子をつけろ的なwarningを出してくれます。親切ですねー

test.cpp:2:38: warning: in-class initializer for static data member of type 'const float' is a GNU extension [-Wgnu]
class A { public: static const float a = 1.0; };
                                     ^   ~~~
test.cpp:2:38: note: use 'constexpr' specifier to silence this warning
class A { public: static const float a = 1.0; };
                                     ^
                  constexpr 
1 warning generated.

ところで加蓮が出ないんだよねーなんでだろうねー