关于网友提出的“ 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,但不确保它不抛出异常。
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() 就没有这个功能。