#include <iostream>
struct C
{
C(int n_) : n(n_) {};
C(const C& x) { n = x.n; std::cout << "Copy: " << n << std::endl; }
C(C&& x) { n = x.n; std::cout << "Move: " << n << std::endl; }
int n;
};
template <class X, class Y>
struct Pair
{
X x;
Y y;
};
template <class X, class Y>
Pair<X, Y> make_pair(X&& x, Y&& y)
{
return Pair<X, Y>{std::forward<X>(x), std::forward<Y>(y)};
}
#define MAKE_PAIR(x,y) decltype(make_pair(x,y)){x,y}
int main()
{
auto z1 = Pair<C, C>{C(1),C(2)};
auto z2 = make_pair(C(3),C(4));
auto z3 = MAKE_PAIR(C(5),C(6));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEMKewogICAgQyhpbnQgbl8pIDogbihuXykge307CiAgICBDKGNvbnN0IEMmIHgpIHsgbiA9IHgubjsgc3RkOjpjb3V0IDw8ICJDb3B5OiAiIDw8IG4gPDwgc3RkOjplbmRsOyB9CiAgICBDKEMmJiB4KSAgICAgIHsgbiA9IHgubjsgc3RkOjpjb3V0IDw8ICJNb3ZlOiAiIDw8IG4gPDwgc3RkOjplbmRsOyB9CiAgICBpbnQgbjsKfTsKCnRlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgpzdHJ1Y3QgUGFpcgp7CiAgICBYIHg7CiAgICBZIHk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KUGFpcjxYLCBZPiBtYWtlX3BhaXIoWCYmIHgsIFkmJiB5KQp7CiAgICByZXR1cm4gUGFpcjxYLCBZPntzdGQ6OmZvcndhcmQ8WD4oeCksIHN0ZDo6Zm9yd2FyZDxZPih5KX07Cn0KCiNkZWZpbmUgTUFLRV9QQUlSKHgseSkgZGVjbHR5cGUobWFrZV9wYWlyKHgseSkpe3gseX0KCmludCBtYWluKCkKewogICAgYXV0byB6MSA9IFBhaXI8QywgQz57QygxKSxDKDIpfTsKICAgIGF1dG8gejIgPSBtYWtlX3BhaXIoQygzKSxDKDQpKTsKICAgIGF1dG8gejMgPSBNQUtFX1BBSVIoQyg1KSxDKDYpKTsKfQo=