本文主要介绍了c 11中的noexcept关键字,有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。
目录
c 11 noexcept关键字1。概念2。两个表格3。异常处理4。实施原则5。使用场景c 11关键字noexcept代替throw。
c++11中noexcept关键字
1. 概念
noexcept关键字添加在c 11之后。这个关键字会告诉编译器,修改后的函数不会异常,有助于编译器对程序进行更多的优化。
2. 两种形式
1)无例外
2)noexcept(表达式)
Noexcept(true)表示修饰函数不会引发异常,noexcept(false)表示修饰函数将引发异常。
3. 异常处理
//示例1
L compare (int x,int y)throw()//在c11之前
{
返回x y;
}
//示例2
bool Compare(int x,int y)no except(no except(x y))//C 11
{
返回x y;
}
示例2使用noexcept运算符,这意味着如果x y没有异常,Compare函数也不会有异常。
4. 实现原理
noexecpt函数向外抛出异常(如果异常是在函数内部捕获并处理的,这不是抛出的异常)。程序会直接终止,调用std:terminate()函数,该函数会在内部调用std:abort()来终止程序。
5. 使用场景
1)移动构造函数
2)移动分配功能。
3)破坏性作用
4)叶片功能
c++11关键字noexcept替代throw
与排除逻辑上不可能的状态的断言相比,异常通常用于逻辑上可能的错误。
在异常处理的代码中,程序员可能见过下面的异常声明表达式:
void excpt_func() throw(int,double) {.}
在excpt_func函数声明之后,我们定义了一个动态异常声明throw(int,double),它指明了excpt_func可能抛出的异常的类型。这个特性其实很少使用,所以在C 11中已经被放弃了(见附录B),表示函数不会抛出异常的动态异常语句throw()也被新的noexcept异常语句所取代。
Noexcept就像它的名字一样,意味着它修改后的函数不会抛出异常。但与throw()动态异常声明不同的是,在C 11中,如果noexcept修改的函数抛出异常,编译器可以选择直接调用std:terminate()函数来终止程序,比基于异常机制的throw()效率更高。这是因为异常机制会带来一些额外的开销,比如函数抛出异常,会导致函数栈依次展开,在这个框架中构造的自动变量的析构函数会按照框架调用。
noexcept修饰符有两种形式
一种是简单地在函数声明后添加noexcept关键字。比如:void except _ func()no except;另一种可以接受常量表达式作为参数,如下:void except _ func () no except(常量表达式);
表达式的结果将被转换为bool类型的值。该值为true,表示函数不会抛出异常;否则,它可能会引发异常。这里,没有常量表达式的noexcept等价于声明noexcept(true),即不会抛出异常。
在C 98中,new可能包含一些抛出的std:bad_alloc异常。
void*运算符new(STD:size _ t)throw(STD:bad _ alloc);
void*运算符new[](STD:size _ t)throw(STD:bad _ alloc);
在C 11中,noexcept(false)用于替换。
void*运算符new(STD:size _ t)no except(false);
void * operator new[](STD:size _ t)no except(false);
当然noexcept更大的作用是保证应用的安全性。比如一个类析构函数不应该抛出异常,那么对于析构函数经常调用的delete函数,C 11默认设置delete函数为noexcept,这样可以提高应用的安全性。
void运算符delete(void *)no except;
void运算符delete[](void *)no except;
同样出于安全考虑,C 11标准中类的析构函数默认为noexcept(true)。
另外:
虚空乐趣();//可以引发任何类型的异常
Voidfun () throw(除了1,除了2,除了3)//后面的括号里有一个异常参数列表,本例中只能抛出这三种情况下的异常。
void fun () throw() //参数表为空,因此不能引发异常。
以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。