c++ - 虚拟方法上的 g++ [[noreturn]]

标签 c++ c++11 g++

我在尝试清理 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/

相关文章:

c++ - 需要帮助以使用MFC C++创建图形

c++ - 如何在 Mac OS 的命令行中编译 Qt 代码

android - NDK r10b 和 c++11 特性

c++ - 如果 operator<< 重载,VSCode 表示 std::chrono 不明确

c++ - How to get around GCC ‘*((void*)& b +4)’ may be used uninitialized in this function warning while using boost::optional

c++ - 使用g++编译cpp文件时出错

c++ - 如何在 Windows Vista 上编译为 Linux/Unix 编写的 C++ 源代码(给出的代码)

c++ - g++ 和 clang++ SFINAE 和 SFINAE 失败的不同行为

c++ - 在 g++ 中是在后台使用 pthreads 的 C++ 11 线程模型吗?

c++ - 是否可以使用非常量引用参数调用 consteval 函数?