c++2.0中,一条经典的规范是:尽可能地为一个函数加上noexcept声明,意味着程序员向编译器保证该函数不会发射异常。
void func()noexcept{} void func()noexcept(express){} //此种写法会根据表达式(express)的结果决定是否发射异常
直接给出建议:当你为一个类设计移动系列函数时,如果可以,最应该为其加上noexcept,以便此类在使用标准库容器时可以用移动操作来代替拷贝。
以vector为例,很多标准库容器需要特定时机的扩容操作:把元素从旧内存拷贝到新开辟的内存,再析构旧内存中的元素。
针对这种情况明显可以用移动操作来优化之。(通常移动操作比拷贝操作速度更快)
但标准库的做法是:如果容器中类的移动操作函数带有noexcept声明,则使用移动操作来代替拷贝;如果没有noexcept声明,则用拷贝来完成扩容。
因此你会发现,将各种移动系列的函数设计为noexcept,会对标准库性能提升有巨大的帮助!