我遇到了一些我不清楚的异常问题。在 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;
}
这合法吗?