我刚在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...
};
有什么想法吗?
谢谢!
答案 0 :(得分:5)
从GCC手册Section 6.1 - When is a Volatile Object Accessed?
当使用对volatile的引用时,G ++不会将等效表达式视为对volatile的访问,而是发出不会访问volatile的警告。这样做的理由是,否则很难确定易失性访问的发生位置,并且不可能忽略返回volatile参考的函数的返回值。同样,如果您希望强制读取,请将引用转换为右值。
警告源于这样的事实:+ =运算符将引用返回到volatile对象,并且表达式'y1 + = y2'忽略该返回值。编译器让你知道引用实际上不会被解引用(即不会读取volatile值)。