2009-02-27 14 views
11

誰もが、このキャストが効果(1337にhappyNumberを設定する以外に)を持っていることを教えてもらえますか、それが他の効果を持たない場合、どうすればこのようなコードを書くことができますか?これはコンパイラのバグか、C++の「隠された機能」ですか?複数の引数を持つstatic_castについて教えてください。

int happyNumber = static_cast<int>(123.456, TRUE, "WTF" , false , "IS" , NULL , "GOING" , 0xff , "ON???" , 1337); 

これはまったくコンパイルされませんでした。私は間違って2番目のパラメータをキャストされている式の関数呼び出しに行くものに設定したバグで見つけました。これは、オブジェクトが2つ目の引数からキャストされ、引数が1つのみの関数を呼び出すという厄介なバグを引き起こしました。これは、コンパイル...そして、最初に私は、Microsoft Visual C++ 2008

+0

これは完全に合法で、バグはありません。 – Anonymous

+0

ああ、そうです。私はコンパイラのバグでなければならないことを知っていたので、それは私にとってはとても混乱していました。以前はカンマ演算子に遭遇したことがありませんでした。 – Statement

答えて

30

静的キャストは一つの引数を取りますが、その引数が式であり、式はcomma operatorを含めることができますを使用しています...

ブームませんでした。カンマを使用すると、その副作用、例えばのために一度に2つの以上の式を評価したい場合に使用されます。

int i, j; 
for (i=0, j=0; i < 10; i++,j++) { 
    // do stuff 
} 

それなしであなただけの初期化子に1つの式それぞれ、条件を評価する可能性があるため、それは多少便利だし、 forループの部分(または式が期待される他の場所)を続けます。それは通常、最も明瞭なコードのために作るのではなく、セマンティクスは奇妙です。あなたが観察したように、コンマ区切りのシーケンスは最後の式の値を評価します。

+0

私は構文のためにそれの使用法を理解していますが、私はstatic_castの機能を把握することができません。 – Statement

+0

機能はありません。カンマ演算子を使用していくつかの演算を行い、結果をキャストします。 – Anonymous

+0

ああ、あなたとルーベンのおかげで、私は今、それがどのように動作するかを理解し、そして:) – Statement