我在尝试清理 g++ 编译器警告时遇到了一些麻烦。
假设我有这门课:
class A
{
public:
[[noreturn]] virtual void will_throw() { throw 0; }
};
在一个非 void 函数中,我调用 will_throw
而不返回。
如果我按值执行此操作,即:
int g()
{
A a;
a.will_throw();
}
然后我就没有收到 -Wreturn-type
警告。
如果我通过指针执行:
int g()
{
A a;
A* aptr = &a;
aptr->will_throw();
}
然后我得到“警告:函数中没有 return 语句返回非 void [-Wreturn-type]”
如果我从 A::will_throw
的声明中删除 virtual
,那么在指针上调用它也不会产生警告。如果该方法是纯虚拟的,则在引用上调用该方法似乎会产生警告,但否则不会产生警告。
我找不到任何说明它应该如何工作的内容,并且这些情况都不会在 Clang 中产生警告。这是 GCC 中的错误吗?
最佳答案
由于该函数是虚拟的,因此编译器不知道(在不跟踪分配的情况下)通过指针(或引用)进行的调用是对 A::will_throw
而不是对某些重写函数的调用可能不是noreturn
。由于这只是一个警告,因此两种行为(或从不警告,或总是警告!)都是符合要求的。
关于c++ - 虚拟方法上的 g++ [[noreturn]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58882878/