#include <iostream>
template <typename T>
struct decrementer_raii
{
T& var;
decrementer_raii(T& v) : var(v) {}
~decrementer_raii() { --var; }
};
void foo(int& x)
{
decrementer_raii<int> dec(x);
std::cout << x << "\n"; // x is still the original value passed-in (14)
for (int i = 0; i < 10; ++i )
{
if ( i == 4 ) throw 10; // force a throw
}
}
int main()
{
int x = 14;
try {
foo(x);
}
catch(...) {}
std::cout << x; // should print 13.
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGRlY3JlbWVudGVyX3JhaWkKewogICBUJiB2YXI7CiAgIGRlY3JlbWVudGVyX3JhaWkoVCYgdikgOiB2YXIodikge30KICAgfmRlY3JlbWVudGVyX3JhaWkoKSB7IC0tdmFyOyB9Cn07Cgp2b2lkIGZvbyhpbnQmIHgpCnsKICAgZGVjcmVtZW50ZXJfcmFpaTxpbnQ+IGRlYyh4KTsKICAgc3RkOjpjb3V0IDw8IHggPDwgIlxuIjsgLy8geCBpcyBzdGlsbCB0aGUgb3JpZ2luYWwgdmFsdWUgcGFzc2VkLWluICgxNCkKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpICkKICAgewogICAgICBpZiAoIGkgPT0gNCApIHRocm93IDEwOyAgLy8gZm9yY2UgYSB0aHJvdyAKICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGludCB4ID0gMTQ7CiAgICB0cnkgewogICAgCWZvbyh4KTsKICAgIH0KICAgIGNhdGNoKC4uLikge30KICAgIHN0ZDo6Y291dCA8PCB4OyAgLy8gc2hvdWxkIHByaW50IDEzLgp9