Время жизни объекта исключения

Я хочу знать, как создается объект исключения? и почему параметр функции обработчика может быть неконстантной ссылкой?

Например:

class E{
    public:
    const  char * error;
    E(const char* arg):error(arg){
    cout << "Constructor of E(): ";}

    E(const E& m){
        cout << "Copy constructor E(E& m): " ;
       error=m.error;
    }
};



int main(){
try{
    throw E("Out of memory");

}
catch(E& e){cout << e.error;}

}

Вывод: конструктор E(): недостаточно памяти

так что я throw E("out of memory") а также E("out of memory")это просто временный объект, и никакой объект не был создан, за исключением E("out of memory") потому что ни один конструктор копирования не был вызван. так что, хотя это E("out of memory") это просто временный объект, у меня есть обработчик, который принимает неконстантную ссылку.

Можете ли вы объяснить мне, почему это возможно?

1 ответ

Решение

Хотите знать, как создается объект исключения?

Когда вы делаете это:

throw E("Out of memory");

Вы создаете объект (типа E) локально. Процессы выбрасывания копируют этот объект в какую-то частную область памяти, не определенную стандартом. Таким образом, брошенный объект должен быть копируемым.

Примечание: компилятору разрешено оптимизировать копию и создавать ее непосредственно в приватном месте. Так что факт, что это не скопировано, - то, потому что компилятор оптимизировал копию (таким образом это больше не является локальным). Попробуйте сделать конструктор копирования закрытым, и теперь он не сможет скомпилироваться.

и почему параметр функции обработчика может быть неконстантной ссылкой?

Когда вы ловите объект:

catch(E& e)

Вы получаете ссылку на объект в частном месте, в которое он был скопирован. Это не постоянное (или временное) значение, поэтому вы можете иметь нормальную ссылку на него.

Другие вопросы по тегам