只是一个很快的问题,在这个问题上我找不到一个很好的参考,尤其是关于未来C++ 0x标准的当前实现。移动构造函数和强烈的例外保证
由于move constructors can throw,这意味着一些标准库函数不能提供强有力的例外保证(例如vector<T>::resize()
)。有一个建议,1)使所有标准库移动构造函数“不抛出”,2)在用户代码上添加编译时检查以确保例如。 std::pair<std::string, MyType>
定义了一个nothrow移动构造函数或根本没有移动构造函数。
这个建议怎么样(特别是关于this question)?这个问题在最终草案中如何“解决”?
最重要的是,当我使用最近的GCC或MSVC 10时,它对我意味着什么?这些标准库的实现是否在例如。 std::vector<MyTypeWithAThrowingMoveConstructor>::resize()
?
编辑:我没有看到this question这显然是相关的。如果对于我的问题是重复的事实达成共识,请关闭它。但是,我真的很感兴趣的是实施,而不是什么已经讨论。
+1非常好奇的问题 – sehe 2011-05-15 21:39:05
他们曾经提供过强大的例外保证吗?我的意思是,你的拷贝构造函数总是可以抛出,所以... – Xeo 2011-05-15 21:45:37
@Xeo:是的,他们做到了。因为在所有副本都成功之后旧缓冲区被破坏*,所以很容易回滚调整大小操作。用一个nothrow移动构造函数,你也可以通过将元素移回旧缓冲区来回滚。通过投掷移动构造函数,Bad Things可能会发生。在这里我们清楚地看到,缺少* strong *'noexcept'关键字。 – 2011-05-15 21:49:30