#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.
}