g++ [[noreturn]] on a virtual method

g++ [[noreturn]] on a virtual method

本文关键字:virtual method on g++ noreturn      更新时间:2023-10-16

我在清理g++编译器警告时遇到了一些麻烦。

假设我有这门课:

class A
{
public:
[[noreturn]] virtual void will_throw() { throw 0; }
};

在一个非void函数中,我调用will_throw而不返回。

如果我是按价值来做的,即:

int g()
{
A a;
a.will_throw();
}

那么我没有收到CCD_ 2警告。

如果我用指针:

int g()
{
A a;
A* aptr = &a;
aptr->will_throw();
}

然后我得到"警告:函数中没有返回语句返回非void[-Wreturn type]">

如果我从A::will_throw的声明中删除virtual,那么在指针上调用它也不会产生任何警告。如果方法是纯虚拟的,那么在引用上调用该方法似乎会产生警告,但在其他情况下则不会。

我找不到任何东西表明这就是它应该如何工作,而且这些案例都没有在克兰发出警告。这是GCC中的一个错误吗?

由于函数是虚拟的,编译器不知道(在没有跟踪赋值的情况下(通过指针(或引用(调用的是A::will_throw,而不是某个可能不是noreturn的重写函数。因为这只是一个警告,所以两种行为(或者从不警告,或者总是警告!(都是一致的。