2012-12-13 5 views
7

prostu biegł następującym ostrzeżeniem w GCC:GCC ostrzeżenie o niejawna dereference

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

podczas kompilacji tego kodu:

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

i niestety nie bardzo rozumiem co GCC próbuje powiedzieć me ...

Klasa Wydajność jest zadeklarowana następująco:

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

Wszelkie pomysły?

Dzięki!

+0

to ostrzeżenie powinno być przestarzałe dla C++ 11, ponieważ w C++ 11 l wartość funkcji nie będzie już odczytywana. –

Odpowiedz

5

z podręcznika GCC, Section 6.1 - When is a Volatile Object Accessed?

Podczas korzystania odniesienie do lotny, G ++ nie traktować jako równoważne wyrażenia dostęp do lotnych, lecz emituje ostrzeżenie, że nie lotny jest dostępne. Uzasadnieniem tego jest to, że w przeciwnym razie trudno jest określić, gdzie występuje niestabilny dostęp, i nie można zignorować wartości zwracanej przez funkcje zwracające ulotne referencje. Ponownie, jeśli chcesz wymusić czytanie, rzuć odwołanie do wartości r.

Ostrzeżenie polega na tym, że operator + = zwraca odniesienia do obiektu lotnych, a wyrażenie „y1 + y2 =” pomija że wartość. Kompilator informuje, że referencja nie zostanie faktycznie usunięta (tzn. Wartość lotna nie zostanie odczytana).

+3

A jeśli nie chcesz wymuszać czytania, w jaki sposób piszesz kod, aby uniknąć ostrzeżenia? –

+1

@BenVoigt: 'void operator = (Yield const & other) volatile;' –

+0

Brak wartości zwrotnej wcale nie jest dobrym rozwiązaniem. A co jeśli jest on używany w niektórych kontekstach, a nie w innych? –