C++11 noexcept 操作符

来源:互联网  时间:2016/9/2 6:20:20

关于网友提出的“ C++11 noexcept 操作符”问题疑问,本网通过在网上对“ C++11 noexcept 操作符”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: C++11 noexcept 操作符
描述:

C++98

class exception {
public:
  exception () throw();
  exception (const exception&) throw();
  exception& operator= (const exception&) throw();
  virtual ~exception() throw();
  virtual const char* what() const throw();
}

C++11
class exception {
public:
  exception () noexcept;
  exception (const exception&) noexcept;
  exception& operator= (const exception&) noexcept;
  virtual ~exception();
  virtual const char* what() const noexcept;
}

高手能讲讲把throw()换成noexcept的好处吗?
解决方案1:

http://www.cnblogs.com/mumuliang/archive/2012/03/22/2411521.html
throw是一种"君子协定"。
我们知道,成员函数尾加const,表明这个成员函数肯定不会修改成员变量。编译器也能判断,如果这个函数直接修改了成员函数,或者调用了非const结尾的成员函数,都会破坏const约定。
但是编译器却无法判断一个函数会不会抛出异常,仅能判断该函数下有没有throw语句。但如果该函数下调用了会抛出异常的函数,就判断不了了。
所以,给函数尾加上throw,仅仅是函数作者的一厢情愿,如果真的发生了抛出异常,他也判断不了,编译器也判断不了。
所以用noexcept,仅仅告诉使用者,这个函数里没有直接用throw,但不确保它不抛出异常。

解决方案2:

http://stackoverflow.com/questions/5756304/noexcept-vs-throws-nothing

解决方案3:

noexcept 可以带表达式的,比 throw () 灵活。比如,


template 
void f (T&& t) noexcept(noexcept(g(t)));

那么 f 的 noexcept specification 就能够 g 的保持同步,throw() 就没有这个功能。

上一篇线程池互相调用问题
下一篇Static控件垂直卷动条消息
明星图片
相关文章
《 C++11 noexcept 操作符》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)