2009-04-03 20 views
6

なぜあなたは割り当てのlhsを投げますか?私は次のように集約いくつかのコードに出くわした

enum BAR { /* enum values omitted */ } 

class Foo{ 
public: 
    void set(const BAR& bar); 
private: 
    uint32_t bits; 
}; 

void Foo::set(const BAR& bar) 
{ 
(uint32_t&)bits = bits | bar; 
} 

私はFooの中に代入::セット中のCスタイルのキャストのポイントを理解していません。あなたはなぜ割り当てのlhsを投げますか?私は夢中ですか、あるいはこれに目的がありますか?

+0

精度低下についてのコンパイラの警告を避けるには、多分?私は確信していません。 –

答えて

8

この場合、キャストされるものはキャストと同じタイプなので、キャストの理由はわかりません。一般に、特定の代入演算子を使用するように強制することができます。

あなたのコードにキャストが含まれている場合は、コードやデザインに問題がある可能性があります。キャストを削除するには、両方を調べる必要があります。

+0

うん。前回私が使ったのは、Win32 APIを使っていました。コードに何か問題があり、それは私ではありませんでした。おそらく15年前より良いアイデアのように見えるものの1つです。 –

+0

+1素敵なマントラ。 – bayda

-1

特定の値の割り当てのみを許可する場合(たとえば、キャストごとに変数をタイプするかどうかの確認は、rhsを拡大した場合のように何かを通過させるのではなく、割り当てのチェックが行われます)。

0

BARがuint32の範囲外の値で定義されていても、私の言う限り、何もしません。雑音のように見えます。

2

私はNeil Butterworthに同意します。この場合のキャストは必要ではなく、明確な「コードの匂い」です。

0

私は、背景を知らずにはっきり言うことはできませんが、誰かが既存のCコードを取得してC++クラスにラップしたように見えます。キャストはCコードから残っているかもしれません。

0

これは正当なものではありません。キャストは左利きではありません...

いずれにせよ、それはかなり無意味です。

関連する問題