最近,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++の奥深さを実感しました.