GCC 关于隐式取消引用的警告

GCC warning about implicit dereference

本文关键字:警告 引用 取消 于隐式 GCC      更新时间:2023-10-16

我刚刚在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 节 - 何时访问易失性对象?

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

警告源于以下事实:+= 运算符返回对易失性对象的引用,而表达式 'y1 += y2' 忽略该返回值。编译器会让您知道引用实际上不会被取消引用(即不会读取易失值)。