Я столкнулся с проблемой исключения, которая мне непонятна. В С++, когда объект бросается, он сначала копируется во временный объект, а затем временный объект передается в код catch. Копия включает использование конструктора экземпляров класса объектов. 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;
}
Является ли это законным?