Я хочу иметь возможность бросать построенный объект, но изменить его непосредственно перед тем, как он будет брошен
(используя идиому именованных параметров ).
Дано:
#include <iostream>
#include <exception>
using namespace std;
struct my_exception : std::exception {
my_exception() {
cout << "my_exception(): this=" << hex << (unsigned long)this << endl;
}
my_exception( my_exception const& ) {
cout << "my_exception( my_exception const& )" << endl;
}
~my_exception() throw() {
cout << "~my_exception()" << endl;
}
my_exception& tweak() {
return *this;
}
char const* what() const throw() { return "my_exception"; }
};
int main() {
try {
throw my_exception().tweak();
}
catch ( my_exception const &e ) {
cout << "&e=" << hex << (unsigned long)&e << endl;
}
}
Когда я запускаю программу, я получаю:
my_exception(): this=7fff5fbfeae0
my_exception( my_exception const& )
~my_exception()
&e=1001000f0
~my_exception()
Как видите, пойманный объект исключения - это не тот, который изначально был брошен.
Если я уберу вызов tweak()
, я получу:
my_exception(): this=1001000f0
&e=1001000f0
~my_exception()
Для случая, когда вызывается tweak()
, почему вызывается конструктор копирования? Я хочу, чтобы tweak()
работал с первоначально сконструированным объектом, и никакая копия не будет сделана. Есть ли способ предотвратить создание копии?
К вашему сведению: я использую g ++ 4.2.1 (часть Xcode в Mac OS X).