GCC关于隐式解除引用的警告

zen*_*hoy 9 c++ gcc gcc-warning

我在GCC中遇到了以下警告:

warning: implicit dereference will not access object of type ‘volatile util::Yield’ in statement [enabled by default]
Run Code Online (Sandbox Code Playgroud)

在编译此代码时:

volatile util::Yield y1;
util::Yield y2;
y1 += y2; // <--- Warning triggered here.
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不太明白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...
};
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢!

e.J*_*mes 7

从GCC手册,第6.1节 - 何时访问易失性对象?

当使用对volatile的引用时,G ++不会将等效表达式视为对volatile的访问,而是发出不会访问volatile的警告.这样做的理由是,否则很难确定易失性访问的发生位置,并且不可能忽略返回volatile参考的函数的返回值.同样,如果您希望强制读取,请将引用转换为右值.

该警告源于这样的事实:+ =运算符返回对volatile对象的引用,并且表达式'y1 + = y2'忽略该返回值.编译器让你知道实际上不会解引用引用(即不会读取volatile值).

  • 如果您不想强制阅读,您如何编写代码以避免警告? (6认同)
  • @BenVoigt:`void operator =(Yield const&other)volatile;` (2认同)
  • 完全没有返回值并不是一个好的解决方案。如果在某些情况下而不是其他情况下使用该怎么办? (2认同)