【发布时间】:2012-04-23 14:56:37
【问题描述】:
我遇到了一些我不清楚的异常问题。在 C++ 中,当一个对象被抛出时,它首先被复制到一个临时对象,然后这个临时对象被传递给捕获代码。复制涉及使用对象的类复制构造函数。 AFAIK,这意味着如果一个类具有私有复制构造函数,则不能将其用作异常。但是在VS2010中,编译运行如下代码:
class Except
{
Except(const Except& other) { i = 2; }
public:
int i;
Except() : i(1) {}
};
int main()
{
try
{
Except ex1;
throw ex1; // private copy constructor is invoked
}
catch (Except& ex2)
{
assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
}
return 0;
}
这合法吗?
【问题讨论】:
-
尝试添加打印或调试并查看调用顺序,也许事情并没有像你想象的那样执行。
-
我在 VS2010 上得到了相同的行为,但它在 gcc v4.3.4 上失败了here。
-
可能是临时对象是构造的,而副本被优化掉了。类似于返回值优化。
-
@DumbCoder,它使用 VS2010 为我编译和执行。
-
@selalerer - 调试显示私有副本 c'tor 确实在预期时间输入。 @zabulus - 正如人们所期望的那样,它无法编译,但错误出现在
catch行。我的问题是throw。
标签: c++ visual-studio-2010 exception private copy-constructor