如何知道函数何时抛出以及何时使用noexcept
How to know when a function will throw and when to use noexcept
在声明函数时,可以使用noexcept
说明符来声明函数不会抛出:
int foo() noexcept
{
return 10;
}
然而,如何确定函数何时抛出?我知道使用new
运算符可能会引发std::bad_alloc
,但其他一些表达式/运算符会引发什么呢?有没有办法明确地确定它是否会这样做?
但是还有哪些其他表达式/运算符可以抛出?
潜在抛出表达式定义为(根据cppreference(
表达式e可能抛出if:
- e是对潜在抛出函数或指向函数的指针的函数调用
- e对潜在的抛出函数(例如重载运算符、新表达式中的分配函数、函数参数的构造函数,或者如果e是完整表达式则为析构函数(进行隐式调用
- e是throw表达式
- e是一个dynamic_cast,它强制转换多态引用类型
- e是一个typeid表达式,应用于指向多态类型的取消引用指针
- e有一个可能引发的立即子表达式
此外,任何具有未定义行为的表达式。
就语言而言,未声明为noexcept
的函数可能会抛出,即使它可能永远不会抛出。
有没有办法明确确定它是否会?
通常情况下,不,您无法确定表达式是否会抛出-至少在假设p≠NP的多项式时间内不会。
但是,可以使用noexcept
-表达式来确定表达式是否可能抛出
void foo() noexcept;
void bar() {
// nothing that might throw
}
std::cout << noexcept(1+1); // prints 1
std::cout << noexcept(foo()) // prints 1
std::cout << noexcept(bar()) // prints 0
std::cout << noexcept(new char); // prints 0
std::cout << noexcept(throw 1); // prints 0
没有办法确定每个函数是否会抛出异常(这至少与停止问题一样困难。但是,在某些情况下,您可以确信函数不会抛出异常。其中一个例子是一个常数函数返回10的琐碎例子。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- std::vector的包装器,使数组的结构看起来像结构的数组
- 何时提供默认参数作为模板参数
- 如何在全屏模式下(在OpenGL中)使背景透明
- 找到两对数字,使它们的乘积的绝对差最小化
- C++:如何使函数只返回作为列表一部分的字符串
- C++-明确何时以及如何调用析构函数
- c++使用foreach使数组为null
- 使外部项目可用于find_package CMake
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 是否可以在C++中使变量真正只读
- 有可能使shared_ptr协变吗
- 何时使函数成为类成员函数C++?
- 如何知道函数何时抛出以及何时使用noexcept
- 何时必须使操作员<<过载?
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- 编译器何时将默认生成的构造函数标记为 noexcept
- Apple C++ LLVM Compiler 4.x & UNICODE:何时需要?UNICODE 是默认编译器字符集吗?使代码同时编译 ANSI 和 UNICODE 版本
- 如何使libcurl c++调用超时和/或知道调用中何时发生超时