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