カンマの罠

最近,C++で引っかかったこと.
以下の様なコードが期待した通りに動作しなくて,ちょっと悩んだ.

// double func( int i ) と
// double func( int i, int j ) のようにオーバーロードされている

double x = func( static_cast<int>( x, y ) );  // func( int i )が実行される
double y = func( static_cast<int>( x ), y );  // func( int i, int j )が実行される

引数を2つ取る方の関数を呼びたかったのですが,一回目の関数呼び出しのようにカッコの位置が間違っていて,オーバーロードされている他の関数が呼ばれてしまうというミスでした.このミスのわかりづらいところが,static_castに引数を2つ渡しても(渡すように見える書き方をしても)エラーにはならないというところです.

これまでstatic_castを関数のように捉えていたのですが,実際は関数ではなく演算子です.そのため,static_castのカッコ内にカンマで区切られた複数の変数があると,カンマオペレータが適用されて一つの変数と評価されるため,エラーとはならないんですね.

普段,カンマオペレータを使う頻度が少ないせいか,なかなか原因に気づけないでちょっと引っかかりました.このタイプの罠には初めて引っかかったので,改めてC++の奥深さを実感しました.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください