Я только что наткнулся на следующее предупреждение в 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...
};
Есть идеи?
Спасибо!
Из руководства GCC, Раздел 6.1 — Когда осуществляется доступ к летучему объекту?
При использовании ссылки на volatile G ++ не обрабатывает эквивалентные выражения как доступ к volatiles, а вместо этого выдает предупреждение о том, что к volatile не обращаются. Основанием для этого является то, что в противном случае становится трудно определить, где происходит изменчивый доступ, и невозможно игнорировать возвращаемое значение из функций, возвращающих изменчивые ссылки. Опять же, если вы хотите вызвать чтение, приведите ссылку на значение.
Предупреждение связано с тем, что оператор + = возвращает ссылка к изменчивому объекту, и что выражение ‘y1 + = y2’ игнорирует это возвращаемое значение. Компилятор сообщает вам, что ссылка на самом деле не будет разыменована (т.е. значение volatile не будет прочитано).
Других решений пока нет …