#include <iostream>
#include <utility>

using namespace std;

struct bar
{
	int i;
	bar() : i(0) {}
	explicit bar(int i0) : i(i0) {}
	bar(bar const & b) : i(b.i) { cout << "copy ctor " << i << endl; }
	bar(bar && b) : i(move(b.i)) { cout << "move ctor " << i << endl; }
};

struct foo
{
	bar a, b;
	foo() : a(), b() {}

	template<class T1, class T2>
	foo(T1 && i0, T2 && i1) : a(forward<T1 &&>(i0)), b(forward<T2 &&>(i1)) {}
};

int main(){
	bar b1(1), b2(2);
	foo f1(b1, b2);
	foo f2(b1, bar(3));
	foo f3(bar(4), b2);
	foo f4(bar(5), bar(6));

	foo f5(7, 8);
}
