-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;
来自this article, Doing without chapter:
使用 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(...)
{
}
}
以 :
结束
terminate called after throwing an instance of 'int'
Aborted (core dumped)
总结:使用-fno-exceptions 和将函数标记为noexcept 时的行为完全不同。
虽然我用 -fno-exceptions 编译了我的整个项目(出于其他原因),但我仍然必须将移动构造函数声明为移动赋值运算符 noexcept 以启用 std::move_if_noexcept 的移动语义?
当您使用该选项时,这些函数不会自动标记为 noexcept。您必须手动完成。不允许编译器做这样的修改。
如果允许这样的修改,那么this example 会产生不同的输出。