如果禁用例外,所有功能都是"noexcept"吗?

TNA*_*TNA 25 c++ gcc language-lawyer c++11

如果你通过编译来关闭异常-fno-exceptions所有被认为是noexcept的函数,例如by std::move_if_noexcept或者你是否仍然必须声明函数noexcept?

BЈо*_*вић 24

-fno-exceptions将阻止您抛出异常,但它无法阻止从库中抛出异常.

例如,下一个示例将因未捕获的异常而终止:

#include <vector>

int main()
{
    std::vector<int> v{1,2,3,4,5,6};

    return v.at(55);
}
Run Code Online (Sandbox Code Playgroud)

但是下一个例子不会编译,因为-fno-exceptions选项:

int main()
{
    throw 22;
}
Run Code Online (Sandbox Code Playgroud)

它失败了:

g++   -std=c++11 -g  -Wall -Wextra -fno-exceptions ./garbage.cpp 
./garbage.cpp: In function ‘int main()’:
./garbage.cpp:4:8: error: exception handling disabled, use -fexceptions to enable
  throw 22;
Run Code Online (Sandbox Code Playgroud)

这篇文章,没有章节:

使用C++关键字(如throw,try和catch)的用户代码将产生错误,即使用户代码包含libstdc ++头文件并使用像basic_iostream这样的构造.


另一方面,noexcept将方法标记为不抛出异常的方法.任何抛出的异常都会调用std::terminate(参见c ++标准中的[except.terminate]/2).

下一个例子:

struct A
{
    void foo() noexcept
    {
        throw 33;
    }
};

int main()
{
    A a;
    try
    {
        a.foo();
    }
    catch(...)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

终止于:

terminate called after throwing an instance of 'int'
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

总结:当您使用-fno-exceptions和将函数标记为时,行为会有很大不同noexcept.


虽然我使用-fno-exceptions编译我的整个项目(由于其他原因)我仍然需要声明移动构造函数一个移动赋值运算符noexcept以启用std :: move_if_noexcept的移动语义?

使用该选项时,这些功能不会自动标记为noexcept.你必须手动完成.不允许编译器进行此类修改.

如果允许这样的修改,那么这个例子将产生不同的输出.