C ライクなキャストと関数型キャストの違いは何ですか? [重複] 質問する

C ライクなキャストと関数型キャストの違いは何ですか? [重複] 質問する

考慮する:

b = (int) a;    // C-like cast notation
b = int (a);    // Functional notation

ベストアンサー1

どうやら、私の最初の回答は間違っていたようです。それらはほぼ同等です。また、long longや のような複合型名ではvoid *関数構文を直接使用できません (つまり、long long(val)機能しません) が、 を使用するとtypedefこの問題を回避できます。

どちらのキャスト表記も非常に悪いので、避けるべきです。例:

const char c = 'a';
void *fred = (void *)(&c);

動作しますが、動作しないはずです。

C スタイルのキャスト表記は、使用される状況に応じてstatic_cast、 のように動作したり、 のように動作したりconst_cast、 のように動作したりreinterpret_cast、あるいはこれら 2 つの組み合わせになったりすることがあります。これらのセマンティクスはかなり複雑で、特定の状況で何が起こっているかを正確に判断するのは必ずしも簡単ではありません。

私は主に C++ スタイルのキャストを使用するようになりstatic_cast<type>(val)、C スタイルのキャストは使用しなくなりました。この質問の調査に基づいて、関数スタイルのキャストも一切使用しないようにします。質問 "C++ キャスト構文スタイル「」には、その理由を詳しく説明した優れた回答(受け入れられた回答)があります。

おすすめ記事