我知道定义例如“将构造函数移动为
noexcept
(如果可能的话),我想我理解它的效果。
但我从未见过关于
operator<()
类型的类似讨论,例如在std::set<>
。
非投掷比较器是否也有一些(潜在的)优化效果(当用于
std::set<>
、std::map<>
、std::sort()
和类似应用时)?
移动构造函数有些特殊,因为有一个明显的回退。在不允许移动抛出异常的情况下,您可以调用
noexcept
移动构造函数,当移动构造函数不是 noexcept
时,您可以回退到副本。因此,将移动构造函数声明为 noexcept
是一种优化。对于 <
而言,当 <
不是 noexcept
时,没有明显的后备方案,其成本会更高。您可以拨打 <
或不拨打。
否则,
<
与任何其他noexcept
具有相同的优点,编译器知道它永远不会抛出(如果抛出,则调用std::terminate
,但不一定会发生通常的堆栈展开)。