我在尝试清理g++编译器警告时遇到了一些麻烦。
假设我有这样一个类:
class A
{
public:
[[noreturn]] virtual void will_throw() { throw 0; }
};在一个非空函数中,我调用will_throw而不返回。
如果我通过值来做这件事,例如:
int g()
{
A a;
a.will_throw();
}然后,我不会收到任何-Wreturn-type警告。
如果我用指针来做:
int g()
{
A a;
A* aptr = &a;
aptr->will_throw();
}然后我得到“警告:在返回非void-Wreturn-type的函数中没有返回语句”
如果我从A::will_throw的声明中删除了virtual,那么在指针上调用它也不会产生任何警告。如果方法是纯虚拟的,则在引用上调用该方法似乎会产生警告,但在其他情况下则不会。
我找不到任何说明这是它应该如何工作的东西,而且这些情况都不会在Clang中产生警告。这是不是GCC的bug?
发布于 2019-11-16 12:20:05
由于函数是虚的,编译器不知道(不跟踪赋值)通过指针(或引用)的调用是对A::will_throw的调用,而不是对可能不是noreturn的覆盖函数的调用。因为这只是一个警告,所以这两种行为(或者从不警告,或者总是警告!)都是一致的。
https://stackoverflow.com/questions/58882878
复制相似问题