std :: function的移动构造函数的异常规范是什么?

Pup*_*ppy 7 c++ c++11

我看过cppreference.com,他们似乎没有noexcept说明std::function(std::function&&).这对我来说似乎很奇怪.在这种情况下,标准是否真的没有给出保证?

Che*_*Alf 5

引用标准(根据您的要求):

C++11§20.8.11.2.1/ 6(来自N3290):
function(function&& f);
template <class A> function(allocator_arg_t, const A& a, function&& f);
效果:如果!f,*this没有目标; 否则,move-将目标构建到目标中,f使其*this保持f在具有未指定值的有效状态.

所以,对不起,没有noexcept移动构造函数.

有一个相关的缺陷报告2062仍然是开放的,但它是朝着另一个方向发展,可以说,至少有一个noexcept显然不应该存在,因为无论什么理由是......

可能是意图是支持那些扔此举可调用构造函数.但这只是在合理化方向上的猜测.例如,想象在这样的函数对象的向量中重新分配缓冲区,其中尝试移动原件,并且在其中一个地方抛出其中一个地方(我认为这是Abrahams et.al的原始示例) .哦,当然,他们不能保证会被搬回来,我们也不能前进.因此重新分配失败,导致重新分配的操作失败,向量处于无效状态.对可调用对象进行非抛掷移动的要求将支持函数对象的这种一般用法,包括优化的向量重新分配(等).恕我直言,令人怀疑的是,这意味着真正做出这种权衡.


Ker*_* SB 3

我想象该function对象能够存储任意的、用户定义的、可调用的对象。当您移动function对象时,包含的用户定义对象也会被移动,并且不能保证可以毫无例外地完成此操作。

  • 对于 std::vector,如果不能保证不抛出移动构造,则会创建副本,因为没有其他方法可以保证异常。 (2认同)