std::function
的大纲告诉我们
function& operator=(function&&);
移动赋值运算符不是noexcept
,禁止将其用于标准容器中的仅移动类型。
但是!它还告诉我们
void swap(function&) noexcept;
同样,默认构造函数是
function() noexcept;
因此我们可以使用默认构造函数后跟交换来实现移动构造函数。
由于我们可以使用swap
实现移动赋值运算符(swap
具有更强的后置条件):
noexcept
?std::function
互换
std::function
的移动赋值运算符不是noexcept
?答案 0 :(得分:4)
如何在
noexcept
中实施std::function
互换?
std::function
对象不一定直接包含目标。它可以包含指向动态分配的目标内存副本的指针。它几乎可以用任何理由来做这件事。最常见的是目标太大而无法直接放入function
,但对于阻止function
满足其要求的其他任何内容,它都是相同的。如果function
仅包含指针,则该指针可以轻松移动到另一个function
。
为什么
std::function
移动赋值运算符不是noexcept
?
没有充分的理由,这就是为什么在未来的C ++版本中提出noexcept
的提案:p0771r0。它指出,与标准指定的相反,一些实现已经将此标记为noexcept
。