2012-12-13 27 views
7

次のように私は...GCCの警告

クラス収量が宣言されています。

class Yield { 
public: 
    Yield(); 

    Yield &operator+=(Yield const &other); 
    Yield &operator+=(Yield const volatile &other); 
    Yield volatile &operator+=(Yield const &other) volatile; 
    Yield volatile &operator+=(Yield const volatile &other) volatile; 

    // Other operators snipped... 
}; 

アイデア

ありがとうございます! GCCマニュアルから

+0

この警告は、C++ 11では廃止される必要があります。これは、C++ 11では、関数呼び出しのlvalueはもはや読み込まれないためです。 –

答えて

5

Section 6.1 - When is a Volatile Object Accessed?

揮発性への参照を使用する場合は、G ++は、揮発性物質へのアクセスのように等価な表現を治療する、その代わりに揮発性がアクセスされていないという警告を発行しません。これは、揮発性のアクセスが発生する場所を特定することが難しくなり、揮発性の参照を返す関数からの戻り値を無視できなくなるという根拠があります。繰り返しますが、強制的に読み込みたい場合は、参照を右辺値にキャストします。

警告は+ =演算子は、揮発性オブジェクトへ参照を返すという事実に由来し、式「Y1 + Y2 =」は、その戻り値を無視します。コンパイラは、参照が実際に参照解除されない(つまり、揮発性の値は読み込まれない)ことを知らせます。

+3

強制的に読み込みを行わない場合は、警告を避けるためにコードをどのように記述しますか? –

+1

@BenVoigt: 'void operator =(降伏定数とその他)volatile;' –

+0

戻り値がまったくないことは良い解決策ではありません。それがいくつかのコンテキストで使用され、他のコンテキストで使用されない場合はどうなるでしょうか? –