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

C++ 移动构造函数和强异常保证,c++,exception,c++11,C++,Exception,C++11,只是一个简单的问题,我找不到很好的参考,特别是关于未来C++0x标准的当前实现 因为,这意味着一些标准库函数无法提供强异常保证(例如,vector::resize()) 有人建议1)让所有标准库移动构造函数“不抛出”,2)对用户代码添加编译时检查,以确保例如std::pair定义了一个nothrow移动构造函数或根本不移动构造函数 该提案(特别是关于)发生了什么变化?最终草案中的问题是如何“解决”的 最重要的是,当我使用最新的GCC或MSVC 10时,它对我意味着什么?这些标准库的实现是否在例如

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

因为,这意味着一些标准库函数无法提供强异常保证(例如,
vector::resize()

有人建议1)让所有标准库移动构造函数“不抛出”,2)对用户代码添加编译时检查,以确保例如
std::pair
定义了一个nothrow移动构造函数或根本不移动构造函数

该提案(特别是关于)发生了什么变化?最终草案中的问题是如何“解决”的

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


编辑:我没有看到哪一个明显相关。如果大家一致认为我的问题是重复的,那么就结束它。然而,我真正感兴趣的是实现了什么,而不是讨论了什么。

我没有检查具体的实现,但总体思路是,如果move构造函数可以抛出,那么向量将不得不复制元素。这样,在出现异常时可以回滚


甚至在
中定义了一个helper函数
move\u if\u noexcept
,以帮助它决定要做什么。

+1非常好奇的问题他们是否提供过强大的异常保证?我的意思是,你的复制构造函数总是可以抛出,所以…@Xeo:是的,他们抛出了。回滚调整大小操作很容易,因为旧的缓冲区在所有复制成功后被销毁。使用nothrow move构造函数,也可以通过将元素移回旧缓冲区来回滚。使用投掷移动构造函数,可能会发生不好的事情。这里我们清楚地看到,缺少一个强的
noexcept
关键字。@Xeo:很容易在复制时提供强异常保证。如果任何副本失败,则恢复到原始副本(未更改)。“移动”的问题在于,您已修改了原始文件。因此,当移动容器并抛出第三个元素时,不能保证前两个元素可以恢复到其原始状态。有趣。我将检查我感兴趣的库中是否存在此
move\u if\u noexcept
(顺便说一句,您有输入错误)帮助程序。@Alexander-MSVC10没有机会完全符合,因为右值规则在发布后已更改。