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

Move constructors and the Strong Exception Guarantee

本文关键字:异常 构造函数 移动      更新时间:2023-10-16

只是一个简单的问题,我找不到一个很好的参考,特别是关于未来 C++0x 标准的当前实现。

由于 move 构造函数可以抛出,这意味着某些标准库函数无法提供强大的异常保证(例如。 vector<T>::resize() )。

有人提议 1) 使所有标准库移动构造函数"不抛出",以及 2) 在用户代码上添加编译时检查以确保例如。 std::pair<std::string, MyType>定义了一个 nothrow 移动构造函数或根本没有移动构造函数。

这个提议发生了什么(特别是关于这个问题)?最终草案中的问题是如何"解决"的?

最重要的是,当我使用最近的 GCC 或 MSVC 10 时,这对我意味着什么?标准库的那些实现是否提供了强异常保证,例如。 std::vector<MyTypeWithAThrowingMoveConstructor>::resize()

编辑:我没有看到这个问题明显相关。如果对我的问题重复这一事实达成共识,请关闭它。但是,我真正感兴趣的是实施的内容,而不是已经讨论的内容

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

甚至还有一个帮助程序函数move_if_noexcept <utility>定义,以帮助它决定做什么。