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

Are all functions "noexcept" if exceptions are disabled?

本文关键字:功能 noexcept 是否 如果      更新时间:2023-10-16

如果您通过编译关闭异常-fno-exceptions是否所有函数都被视为 no,例如由std::move_if_noexcept还是您仍然必须声明函数 no除非出于这个原因?

-fno-exceptions将阻止您引发异常,但无法阻止从库中引发异常。

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

#include <vector>
int main()
{
std::vector<int> v{1,2,3,4,5,6};
return v.at(55);
}

但是下一个示例将无法编译,因为-fno-exceptions选项:

int main()
{
throw 22;
}

它失败并显示:

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;

从这篇文章中,没有一章:

使用C++关键字(如抛出、尝试和捕获)的用户代码将 即使用户代码包含 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(...)
{
}
}

终止于 :

terminate called after throwing an instance of 'int'
Aborted (core dumped)

结论:当您使用-fno-exceptions和将函数标记为noexcept时,行为完全不同。


尽管我使用 -fno-exceptions(出于其他原因)编译了我的整个项目,但我仍然必须声明移动构造函数为移动辅助运算符 noexcept 为 std::move_if_noexcept 启用移动语义?

使用该选项时,函数不会自动标记为 noexcept。您必须手动执行此操作。不允许编译器进行此类修改。

如果允许此类修改,则此示例将产生不同的输出。