g++ [[noreturn]] on a virtual method
g++ [[noreturn]] on a virtual method
我在清理g++编译器警告时遇到了一些麻烦。
假设我有这门课:
class A
{
public:
[[noreturn]] virtual void will_throw() { throw 0; }
};
在一个非void函数中,我调用will_throw
而不返回。
如果我是按价值来做的,即:
int g()
{
A a;
a.will_throw();
}
那么我没有收到CCD_ 2警告。
如果我用指针:
int g()
{
A a;
A* aptr = &a;
aptr->will_throw();
}
然后我得到"警告:函数中没有返回语句返回非void[-Wreturn type]">
如果我从A::will_throw
的声明中删除virtual
,那么在指针上调用它也不会产生任何警告。如果方法是纯虚拟的,那么在引用上调用该方法似乎会产生警告,但在其他情况下则不会。
我找不到任何东西表明这就是它应该如何工作,而且这些案例都没有在克兰发出警告。这是GCC中的一个错误吗?
由于函数是虚拟的,编译器不知道(在没有跟踪赋值的情况下(通过指针(或引用(调用的是A::will_throw
,而不是某个可能不是noreturn
的重写函数。因为这只是一个警告,所以两种行为(或者从不警告,或者总是警告!(都是一致的。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 通过 get-Method 访问变量在类外不起作用
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- 在基类中调用的 VIrtual 基函数,C++
- C++类:virtual和override,或者两者都没有
- g++ [[noreturn]] on a virtual method
- "virtual"对C++析构函数有何影响?
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 错误"pure virtual method called",当此方法已被覆盖时
- 如何修复此错误? "Method 'str' could not be resolved"
- 为什么C++尝试/捕获没有捕获"pure virtual call"异常?
- 使用 -march 编译会导致线程说"pure virtual method called"
- 堆栈帧内重复的内联构造函数会导致"pure virtual method called"?
- 如何解决"pure virtual method called"
- C++'has virtual method ... but non-virtual destructor'编译期间警告是什么意思?
- C++ Virtual Method
- C++ 临时 - "pure virtual method called"
- "non-virtual thunk to <method name>" ,引用自:Vtable <classname>for in <objectfile.o>