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

时间:2018-01-21 12:50:35

标签: c++

func.wrap.func中{p} std::function的大纲告诉我们

  

function& operator=(function&&);

移动赋值运算符不是noexcept,禁止将其用于标准容器中的仅移动类型。

但是!它还告诉我们

  

void swap(function&) noexcept;

同样,默认构造函数是

  

function() noexcept;

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

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

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

1 个答案:

答案 0 :(得分:4)

  

如何在noexcept中实施std::function互换?

std::function对象不一定直接包含目标。它可以包含指向动态分配的目标内存副本的指针。它几乎可以用任何理由来做这件事。最常见的是目标太大而无法直接放入function,但对于阻止function满足其要求的其他任何内容,它都是相同的。如果function仅包含指针,则该指针可以轻松移动到另一个function

  

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

没有充分的理由,这就是为什么在未来的C ++版本中提出noexcept的提案:p0771r0。它指出,与标准指定的相反,一些实现已经将此标记为noexcept