首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚方法上的g++ [[noreturn]]

虚方法上的g++ [[noreturn]]
EN

Stack Overflow用户
提问于 2019-11-16 02:38:21
回答 1查看 141关注 0票数 2

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

假设我有这样一个类:

代码语言:javascript
复制
class A
{
public:
    [[noreturn]] virtual void will_throw() { throw 0; }
};

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

如果我通过值来做这件事,例如:

代码语言:javascript
复制
int g()
{
    A a;
    a.will_throw();
}

然后,我不会收到任何-Wreturn-type警告。

如果我用指针来做:

代码语言:javascript
复制
int g()
{
    A a;
    A* aptr = &a;
    aptr->will_throw();
}

然后我得到“警告:在返回非void-Wreturn-type的函数中没有返回语句”

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

我找不到任何说明这是它应该如何工作的东西,而且这些情况都不会在Clang中产生警告。这是不是GCC的bug?

EN

回答 1

Stack Overflow用户

发布于 2019-11-16 12:20:05

由于函数是虚的,编译器不知道(不跟踪赋值)通过指针(或引用)的调用是对A::will_throw的调用,而不是对可能不是noreturn的覆盖函数的调用。因为这只是一个警告,所以这两种行为(或者从不警告,或者总是警告!)都是一致的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58882878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档