如果禁用了例外,是否所有功能都"noexcept"?
Are all functions "noexcept" if exceptions are disabled?
如果您通过编译关闭异常-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。您必须手动执行此操作。不允许编译器进行此类修改。
如果允许此类修改,则此示例将产生不同的输出。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 具有模板类型内部功能的不同操作的NOExcept
- 如果禁用了例外,是否所有功能都"noexcept"?
- “constexpr”功能是否也应该是“noexcept”