移动构造函数和强异常保证

时间:2011-05-15 21:37:27

标签: c++ exception c++11

只是一个简单的问题,我找不到一个好的参考,特别是关于未来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 个答案:

答案 0 :(得分:4)

我没有检查具体的实现,但一般的想法是,如果移动构造函数可以抛出,向量将不得不复制元素。这样就可以在异常的情况下回滚。

move_if_noexcept中定义了一个辅助函数<utility>,以帮助它决定要做什么。