12

GCCで次の警告に出くわしました:

warning: implicit dereference will not access object of type ‘volatile util::Yield’ in statement [enabled by default]

このコードのコンパイル中:

volatile util::Yield y1;
util::Yield y2;
y1 += y2; // <--- Warning triggered here.

残念ながら、GCCが私に伝えようとしていることをよく理解していません...

クラス Yield は次のように宣言されます。

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...
};

何か案は?

ありがとう!

4

1 に答える 1

9

GCC マニュアルのセクション 6.1 - 揮発性オブジェクトがアクセスされるのはいつですか?

volatile への参照を使用する場合、G++ は同等の式を volatile へのアクセスとして扱いませんが、代わりに volatile にアクセスしないという警告を発行します。そうしないと、揮発性アクセスが発生した場所を特定することが難しくなり、揮発性参照を返す関数からの戻り値を無視できなくなるためです。繰り返しますが、強制的に読み取りたい場合は、参照を右辺値にキャストします。

この警告は、+= 演算子が volatile オブジェクトへの参照を返し、式 'y1 += y2' がその戻り値を無視するという事実から発生します。コンパイラは、参照が実際には逆参照されないことを知らせています (つまり、volatile 値は読み取られません)。

于 2012-12-13T22:31:57.120 に答える