移动构造函数和强大的异常保证
Move constructors and the Strong Exception Guarantee
只是一个简单的问题,我找不到一个很好的参考,特别是关于未来 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>
定义,以帮助它决定做什么。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 如何编写带有异常的构造函数
- 从 C++ 中异常的构造函数引发异常
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 稍后在构造函数中重新启动异常指令删除此指令
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 构造函数中引发的异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 从构造函数内存泄漏引发异常
- C++:如何捕获构造函数引发的异常?
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- V8 - 节点C++插件 - 在构造函数中引发异常会导致"致命错误:v8::ToLocalChecked Em
- 为什么要抛出引用调用复制构造函数的异常?
- std::vector 默认构造函数可以抛出异常吗?
- 如何防止构造函数在引发异常时创建对象
- 当构造函数的参数类型错误时引发异常
- 异常构造函数中的例外
- C++11 引入了采用 'const char*' 的异常构造函数.但是为什么
- 在异常构造函数中参数化错误消息是一种好的做法吗
- 异常构造函数来填充字符串流