移动构造函数的noexcept
规范已知在C++ 0x中具有性能影响。例如,std::vector<T>::resize
,std::vector<T>::reserve
可以使用T的非投掷移动构造函数,如果它可以被证明不抛出。 noexcept
操作符是在编译时检查该属性的方法。如果noexcept表示T的move-ctor没有抛出,T对象将被移动而不是被复制,最有可能实现更高的性能。交换noexcept规范是否会影响性能?
我的问题是有关成员交换或命名空间级别的交换为用户定义的类T.的C++ 0x规范花费一些精力在出口noexcept的std::pair
,std::tuple
,std::array:swap
可能表明用户定义的类应尽量规范使用相同的原则。例如,std::pair::swap
声明等同于:
void std::pair::swap(pair& p) noexcept(noexcept(swap(first, p.first)) && noexcept(swap(second, p.second));
它基本上是说,如果first
或second
成员的任何交换抛出对的交换将抛出。交换first
,second
可能有他们自己的noexcept规范的成员。
最后的问题:有没有在那里(在STL或其他)的泛型算法,取决于交换noexcept规范做不同的事情?而且,这有什么表现含义?