在我的工作场所,我们使用不同的内部名称来表示noreturn
属性。假设它是INTERNAL_DONT_RETURN
。
我正在编写一个类的成员函数,在其中我进行了如下操作:
INTERNAL_DONT_RETURN void foo() const
{
if(!*this)
{
throw CoolException();
}
m_call_throw();
}
这个m_call_throw()是一个私有类成员
std::function<void()>m_call_throw
,在类的构造函数中作为lambda表达式被填充。这个lambda什么也不做,只是执行以下代码:
m_call_throw([uncoolID]() { throw UncoolException(uncoolID); })
现在,gcc-4.9.3和clang都给我以下警告:
error: function declared 'noreturn' should not return [-Werror,-Winvalid-noreturn]
}
^
我已经查阅了这个问题和这个问题,但它们都没有解释以上警告的原因。1)编译器是否像这里所解释的那样隐式添加了
return
?2)即使我抛出异常,为什么编译器认为我的函数会返回?
3)noreturn属性提到:
这与我的问题有关吗?noreturn关键字不影响异常路径:标记为noreturn的函数仍然可以通过抛出异常或调用longjmp返回给调用者。