std :: function的移动赋值不是noexcept,而是std :: function :: swap.是什么赋予了?

mil*_*bug 6 c++

std::functionfunc.wrap.func中的概要告诉我们

function& operator=(function&&);

移动赋值运算符不是noexcept,禁止使用仅移动标准容器中的类型.

但!它也告诉我们

void swap(function&) noexcept;

同样,默认构造函数是

function() noexcept;

因此,我们可以使用默认构造函数后跟交换来实现移动构造函数.

因为我们可以实现移动赋值运算符swap(swap具有更强的后置条件):

  • 如何noexcept实现互换std::function
  • 为什么std::function移动赋值运算符不是noexcept

小智 5

如何noexcept实现交换std::function

std::function对象不一定直接包含目标。它可能包含一个指向目标的动态分配内存副本的指针。它可能出于任何原因这样做。最常见的是目标太大而无法直接放入 中function,但对于其他任何无法function满足其要求的情况也是如此。如果function只有一个指针,该指针可以很容易地移动到另一个function.

为什么std::function移动赋值运算符不是noexcept

没有充分的理由,这就是为什么有人提议noexcept在 C++ 的未来版本中使用它:p0771r0。它指出,与标准规定的相反,一些实现确实已经将其标记为noexcept无论如何。