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的内容