月別アーカイブ: 2015年12月

C99の指示付き初期化子をC++で使っちゃっても良いのだろうか

C99の指示付き初期化子、便利ですよね。
でもC++11/14ではこれ定義されてない。

定義されてないんだけど、ClangなんかではC++と混ぜてフツーに使えてしまう。例えばこんな。

構造体メンバの初期化記法(構造体定義に直に初期値を記述)はC++11。そんで a の指示付き初期化リストの記述はC99。これで a は typeが0、valueが10 で初期化される。この書き方だと以下の利点がある。

・どのメンバをどの値で初期化するのかが判りやすい (C99)
・初期化の値の順番を気にしないで済む (C99)
・初期化で記述しなかったメンバはデフォルト値が設定される (C++11)

便利なんです。便利なんですが、Clangではコンパイル通るけど厳密にはアウトな書き方。(たぶん)

これが便利なのは例えば、「引数が沢山あって、でもどれもデフォルト値がある関数」。
C++の関数のデフォルト値は途中の引数だけ省略ってのができないのだけれど、引数を構造体でまとめてしまえば上記の方法で任意の引数(メンバ)だけを省略できるようになる。

こうすると、
・引数の値に名前を付けられて判りやすい
・引数の順番を気にせずに済む
・任意の引数を省略してconstexprなデフォルト値で初期化できる
のだ。

でも前述の通りC++規格的によろしくない。


追記:
インテルコンパイラ16.0ではやはりというか怒られる/(^o^)\
インテルコンパイラはC99オプションとC++11オプションを同時に有効にできないんだよな〜