【发布时间】:2013-01-30 10:15:15
【问题描述】:
C++ 标准保证std::swap 不会抛出异常。但是,如果要交换的对象在交换期间抛出异常怎么办?接下来,调用者应该如何发现异常发生了?来电者应该采取什么措施?
PS:构造函数抛出异常是很常见的。
struct A
{
A(const A&)
{
throw 1;
}
A& operator =(const A&)
{
throw 2;
return *this;
}
};
int main()
{
A a1, a2;
std::swap(a1, a2); // An exception happened, but the caller doesn't know.
// How to do here ???
}
【问题讨论】:
-
A 的作者因为没有提供不抛出的
swap(A, A)过载而被鞭打 10 次 -
@rhalbersma:并不是说提供重载会有所帮助,因为提问者的代码完全限定了调用
std::swap。 -
@SteveJessop 看到我的回答为什么确实会好很多。
-
"构造函数抛出异常是很常见的。" 复制构造函数抛出异常不是很常见(外部内存分配错误)。
标签: c++ exception c++11 standards swap