C++ 错误:函数声明为';诺雷顿';不应该回来
在我的工作场所中,C++ 错误:函数声明为';诺雷顿';不应该回来,c++,c++11,gcc,lambda,C++,C++11,Gcc,Lambda,在我的工作场所中,noreturn属性的内部名称不同。假设它是INTERNAL\u DONT\u RETURN 我正在编写一个类的成员函数 INTERNAL_DONT_RETURN void foo() const { if(!*this) { throw CoolException(); } m_call_throw(); } 这个m_call_throw()是一个私有类成员std::functionm_call_throw,它作为lambda填
noreturn
属性的内部名称不同。假设它是INTERNAL\u DONT\u RETURN
我正在编写一个类的成员函数
INTERNAL_DONT_RETURN void foo() const
{
if(!*this)
{
throw CoolException();
}
m_call_throw();
}
这个m_call_throw()是一个私有类成员std::functionm_call_throw
,它作为lambda填充到类的构造函数中。这个兰姆达什么也不做,只是
m_call_throw([uncoolID](){throw uncolexception(uncoolID);})
现在,gcc-4.9.3和clang都给了我以下警告
错误:声明为“noreturn”的函数不应返回[-Werror,-Winvalid noreturn]
}
^
我已经咨询并提出问题,但没有人解释上述警告的原因
1) 编译器是否如所解释的那样隐式添加return
2) 即使我抛出异常,为什么编译器相信我的函数会返回
3) 提到
当出现异常时,noreturn关键字不影响异常路径
应用:标记为noreturn的函数仍然可以通过
正在引发异常或调用longjmp
这和我的问题有关吗?但你还是回来了!如果if语句为false,则通过函数结尾的下降返回。您可能知道这永远不会发生,因为
m\u call\u throw()
也不会返回(是吗?),但编译器显然不理解这一逻辑
m\u call\u throw()
是否标记为noreturn?如果没有,请添加它。如果编译器没有注意到这一点,您可以在函数末尾添加一个额外的抛出,您知道这个抛出永远不会到达,但应该会使警告静音。这是因为您的foo
返回,或者至少似乎返回
当使用noreturn
声明函数时,该函数不得返回:
void Foo() __attribute__((noreturn));
void Foo()
{
// The application will exit, without returning.
exit(0);
}
int main()
{
Foo();
}
您知道您的m\u call\u throw
也不会返回,但编译器不会返回
因此,明确地告诉编译器它没有帮助,如下所示:
void Foo() __attribute__((noreturn));
void m_call_throw() __attribute__((noreturn));
void Foo()
{
// Ok, no return huh?
m_call_throw();
}
实时演示是。编译器无法证明函数将始终抛出。这不是一个bug-总会有编译器无法证明的情况 它是否应该警告你是一个有趣的问题。警告您意味着它有时会报告一个不存在的bug;不警告您意味着它有时会错过一个真正的错误 您可以轻松地将警告设置为非致命警告,或通过多种方式使其静音。为此特定文件禁用它,或在末尾添加对
abort
的调用。在每种情况下都需要权衡,但这就是生活
如果可以从lambda/std::函数切换到普通成员函数,只需这样做,并使其成为
noreturn
。唉,您不能有noreturn
函数类型或noreturn
std::function或noreturn
lambda,这是语言中的一个错误 请提供+1以添加我们不能(尚未)拥有noreturn函数类型、noreturn std::函数或noreturn lambda的内容