Я хочу знать, как создается объект исключения? и почему параметр функции обработчика может быть неконстантной ссылкой?
Например:
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")
это просто временный объект, у меня есть обработчик, который принимает неконстантную ссылку.
Можете ли вы объяснить мне, почему это возможно?
Хотите знать, как создается объект исключения?
Когда вы делаете это:
throw E("Out of memory");
Вы создаете объект (типа E) локально. Процессы выброса копируют этот объект в какую-то частную область памяти, не определенную стандартом. Таким образом, брошенный объект должен быть копируемым.
Примечание: компилятору разрешено оптимизировать копию и создавать ее непосредственно в приватном месте. Так что факт, что это не скопировано, — то, потому что компилятор оптимизировал копию (таким образом это больше не является локальным). Попробуйте сделать конструктор копирования закрытым, и теперь он не сможет скомпилироваться.
и почему параметр функции обработчика может быть неконстантной ссылкой?
Когда вы ловите объект:
catch(E& e)
Вы получаете ссылку на объект в частном месте, в которое он был скопирован. Это не постоянное (или временное) значение, поэтому вы можете иметь нормальную ссылку на него.
Других решений пока нет …