std::function
的概述在func.wrap.func中告诉我们:
function& operator=(function&&);
移动赋值运算符不是noexcept
,不能与move only类型在标准容器中一同使用。
但是! 它还告诉我们:
void swap(function&) noexcept;
同样地,默认构造函数为:
function() noexcept;
因此,我们可以实现移动构造函数,先使用默认构造函数,然后再进行swap。
由于我们可以使用swap
实现移动赋值运算符(swap
具有更强的后置条件):
- 如何在
std::function
中实现一个noexcept
交换? - 为什么
std::function
的移动赋值运算符不是noexcept
?
noexcept
的。否则,我们将其视为“大对象”并将其放在指针后面,这个指针是可以轻松进行noexcept
移动和交换的。这回答了我的问题。 - milleniumbug