#include <iostream>
using namespace std;
int gCnt = 0;
struct Ptr {
int num;
Ptr() : num(++gCnt) { cout << "Ptr::Ptr() " << num << endl; }
Ptr(Ptr const& o) : num(o.num*10 + 2) { cout << "Ptr::Ptr( " << o.num << " ) " << num << endl; }
~Ptr() { cout << "Ptr::~Ptr() " << num << endl; }
};
struct Arr {
Arr() { cout << "Arr::Arr()" << endl; }
~Arr() { cout << "Arr::~Arr()" << endl; }
operator Ptr() const { cout << "Arr::operator Ptr()" << endl; return Ptr(); }
private:
Arr(Arr const&);
};
struct S {
static const Arr a;
};
const Arr S::a;
Ptr const& foo() { cout << "call" << endl; Ptr const& r = S::a; cout << "return" << endl; return r; }
int main()
{
using namespace std;
cout << "a" << endl;
{
cout << "b" << endl;
Ptr const& x = foo();
cout << x.num << endl;
cout << x.num << endl;
cout << "c" << endl;
}
cout << "d" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBnQ250ID0gMDsKCnN0cnVjdCBQdHIgewogICAgaW50IG51bTsKCVB0cigpIDogbnVtKCsrZ0NudCkgeyBjb3V0IDw8ICJQdHI6OlB0cigpICIgPDwgbnVtIDw8IGVuZGw7IH0KCVB0cihQdHIgY29uc3QmIG8pIDogbnVtKG8ubnVtKjEwICsgMikgeyBjb3V0IDw8ICJQdHI6OlB0ciggIiA8PCBvLm51bSA8PCAiICkgIiA8PCBudW0gPDwgZW5kbDsgfQoJflB0cigpIHsgY291dCA8PCAiUHRyOjp+UHRyKCkgIiA8PCBudW0gPDwgZW5kbDsgfQp9OwoKc3RydWN0IEFyciB7CglBcnIoKSB7IGNvdXQgPDwgIkFycjo6QXJyKCkiIDw8IGVuZGw7IH0KCX5BcnIoKSB7IGNvdXQgPDwgIkFycjo6fkFycigpIiA8PCBlbmRsOyB9CglvcGVyYXRvciBQdHIoKSBjb25zdCB7IGNvdXQgPDwgIkFycjo6b3BlcmF0b3IgUHRyKCkiIDw8IGVuZGw7IHJldHVybiBQdHIoKTsgfQpwcml2YXRlOgoJQXJyKEFyciBjb25zdCYpOwp9OwoKc3RydWN0IFMgewoJc3RhdGljIGNvbnN0IEFyciBhOwp9Owpjb25zdCBBcnIgUzo6YTsKClB0ciBjb25zdCYgZm9vKCkgeyBjb3V0IDw8ICJjYWxsIiA8PCBlbmRsOyBQdHIgY29uc3QmIHIgPSBTOjphOyBjb3V0IDw8ICJyZXR1cm4iIDw8IGVuZGw7IHJldHVybiByOyB9CgppbnQgbWFpbigpCnsKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CgogICAgY291dCA8PCAiYSIgPDwgZW5kbDsKICAgIHsKCQljb3V0IDw8ICJiIiA8PCBlbmRsOwoJCVB0ciBjb25zdCYgeCA9IGZvbygpOwoJCWNvdXQgPDwgeC5udW0gPDwgZW5kbDsKCQljb3V0IDw8IHgubnVtIDw8IGVuZGw7CgkJY291dCA8PCAiYyIgPDwgZW5kbDsKICAgIH0KICAgIGNvdXQgPDwgImQiIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=