【发布时间】:2020-03-11 22:51:26
【问题描述】:
我在尝试清理 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();
}
然后我得到“警告:在返回非 void [-Wreturn-type] 的函数中没有返回语句”
如果我从A::will_throw 的声明中删除virtual,那么在指针上调用它也不会产生任何警告。如果方法是纯虚拟的,则在引用上调用该方法似乎会产生警告,否则不会。
我找不到任何说明它应该如何工作的东西,而且这些情况都不会在 Clang 中产生警告。这是 GCC 中的错误吗?
【问题讨论】:
-
对我来说当然是一个错误。我能够使用 GCC 9 重现此问题,而 Clang 9 似乎没有任何问题。