#include <iostream>
struct A;
struct B
{
A& ref;
int n;
B(A& a) : ref(a), n(1) {}
void show() const;
};
struct A
{
B& ref;
int n;
A(B& b) : ref(b), n(2) {}
void show() const;
};
void A::show() const
{
std::cout << "A.n is " << n
<< " A.ref.n is " << ref.n
<< " A.ref.ref.n is " << ref.ref.n
<< " A.ref.ref.ref.n is " << ref.ref.ref.n
<< '\n';
}
void B::show() const
{
std::cout << "B.n is " << n
<< " B.ref.n is " << ref.n
<< " B.ref.ref.n is " << ref.ref.n
<< " B.ref.ref.ref.n is " << ref.ref.ref.n
<< '\n';
}
int main()
{
// std::pair<A, B> pair(pair.second, pair.first);
struct {B first; A second;} pair = {pair.second, pair.first};
pair.first.show();
pair.second.show();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgQTsKc3RydWN0IEIKewogICAgQSYgcmVmOwogICAgaW50IG47CiAgICBCKEEmIGEpIDogcmVmKGEpLCBuKDEpIHt9CiAgICB2b2lkIHNob3coKSBjb25zdDsKfTsKCnN0cnVjdCBBCnsKICAgIEImIHJlZjsKICAgIGludCBuOwogICAgQShCJiBiKSA6IHJlZihiKSwgbigyKSB7fQogICAgdm9pZCBzaG93KCkgY29uc3Q7Cn07Cgp2b2lkIEE6OnNob3coKSBjb25zdAp7CiAgICBzdGQ6OmNvdXQgPDwgIkEubiBpcyAiIDw8IG4KICAgICAgICAgICAgICA8PCAiIEEucmVmLm4gaXMgIiA8PCByZWYubgogICAgICAgICAgICAgIDw8ICIgQS5yZWYucmVmLm4gaXMgIiA8PCByZWYucmVmLm4KICAgICAgICAgICAgICA8PCAiIEEucmVmLnJlZi5yZWYubiBpcyAiIDw8IHJlZi5yZWYucmVmLm4KICAgICAgICAgICAgICA8PCAnXG4nOwp9Cgp2b2lkIEI6OnNob3coKSBjb25zdAp7CiAgICBzdGQ6OmNvdXQgPDwgIkIubiBpcyAiIDw8IG4KICAgICAgICAgICAgICA8PCAiIEIucmVmLm4gaXMgIiA8PCByZWYubgogICAgICAgICAgICAgIDw8ICIgQi5yZWYucmVmLm4gaXMgIiA8PCByZWYucmVmLm4KICAgICAgICAgICAgICA8PCAiIEIucmVmLnJlZi5yZWYubiBpcyAiIDw8IHJlZi5yZWYucmVmLm4KICAgICAgICAgICAgICA8PCAnXG4nOwp9CgppbnQgbWFpbigpCnsKLy8gICAgc3RkOjpwYWlyPEEsIEI+IHBhaXIocGFpci5zZWNvbmQsIHBhaXIuZmlyc3QpOwogICAgc3RydWN0IHtCIGZpcnN0OyBBIHNlY29uZDt9IHBhaXIgPSB7cGFpci5zZWNvbmQsIHBhaXIuZmlyc3R9OwogICAgcGFpci5maXJzdC5zaG93KCk7CiAgICBwYWlyLnNlY29uZC5zaG93KCk7Cn0K