- 作者: 高橋晶,安藤敏彦,一戸優介,楠田真矢,道化師,湯朝剛介
- 出版社/メーカー: 技術評論社
- 発売日: 2013/05/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
そろそろ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.
ところで加蓮が出ないんだよねーなんでだろうねー