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

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

Например:

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") это просто временный объект, у меня есть обработчик, который принимает неконстантную ссылку.

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

8

Решение

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

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

throw E("Out of memory");

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

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

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

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

catch(E& e)

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

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]