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无论如何。