首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++11 noexcept 操作符,该如何解决

2013-03-12 
C++11noexcept 操作符C++98class exception {public:exception () throw()exception (const exception&)

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的好处吗?
[解决办法]
http://stackoverflow.com/questions/5756304/noexcept-vs-throws-nothing
[解决办法]
http://www.cnblogs.com/mumuliang/archive/2012/03/22/2411521.html

throw是一种"君子协定"。

我们知道,成员函数尾加const,表明这个成员函数肯定不会修改成员变量。编译器也能判断,如果这个函数直接修改了成员函数,或者调用了非const结尾的成员函数,都会破坏const约定。

但是编译器却无法判断一个函数会不会抛出异常,仅能判断该函数下有没有throw语句。但如果该函数下调用了会抛出异常的函数,就判断不了了。

所以,给函数尾加上throw,仅仅是函数作者的一厢情愿,如果真的发生了抛出异常,他也判断不了,编译器也判断不了。

所以用noexcept,仅仅告诉使用者,这个函数里没有直接用throw,但不确保它不抛出异常。
[解决办法]
noexcept 可以带表达式的,比 throw () 灵活。比如,

template <typename T>
void f (T&& t) noexcept(noexcept(g(t)));

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

热点排行