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