Можно ли выбрасывать объекты с закрытыми конструкторами копий?

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

Это законно?

11
задан eran 11 April 2012 в 09:54
поделиться