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.你必须手动完成.不允许编译器进行此类修改.
如果允许这样的修改,那么这个例子将产生不同的输出.
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |