#pragma once #include struct Reg { int r_; Reg(int r) : r_(r) {} }; inline const Reg& getReg0() { static const Reg r(0); return r; } inline const Reg& getReg1() { static const Reg r(1); return r; } inline const Reg& getReg2() { static const Reg r(2); return r; } static const Reg& r0 = getReg0(); static const Reg& r1 = getReg1(); static const Reg& r2 = getReg2(); inline void putReg() { puts("putReg"); printf("r0=%p, %d\n", &r0, r0.r_); printf("r0=%p, %d\n", &r0, r1.r_); printf("r0=%p, %d\n", &r0, r2.r_); } struct A { int a; A() : a(5) { puts("A cstr"); } ~A() { puts("A dstr"); } void put() const { printf("a=%d\n", a); } }; template struct XT { static A a; }; template A XT::a; typedef XT<0> X; void init(); struct Init { Init() { puts("Init"); init(); putReg(); } }; static Init s_init;