#include <cstdio>		// for printf.
#include <algorithm>

struct unko
{
	unko() { std::printf("コンストラクター\n"); }
	unko(const unko &) { std::printf("copy\n"); }
	unko(unko &&) {std::printf("move\n"); }
	~unko() { std::printf("デストラクター\n"); }
	int big_data[1000];
};

template<typename T>
auto my_foreach1(T t) -> T
{
	return t;
}

template<typename T>
auto my_foreach2(T t) -> T
{
	return std::move(t);
}

template<typename T>
auto my_foreach3(T &&t) -> T
{
	return t;
}
/*
template<typename T>
auto my_foreach4(T &&t) -> T
{
	return std::move(t);
}
*/
template<typename T>
auto my_foreach5(T &&t) -> T &&
{
	return std::forward<T>(t);
}

int main()
{
	unko lvalue;

	std::printf("\n----1\n");
	my_foreach1(unko{});
	std::printf("--\n");
	my_foreach1(lvalue);

	std::printf("\n----2\n");
	my_foreach2(unko{});
	std::printf("--\n");
	my_foreach2(lvalue);

	std::printf("\n----3\n");
	my_foreach3(unko{});
	std::printf("--\n");
	my_foreach3(lvalue);

	std::printf("\n----5\n");
	my_foreach5(unko{});
	std::printf("--\n");
	my_foreach5(lvalue);

	std::printf("----生存期間確認1\n");
	{
		auto v = my_foreach5(unko{});
	}

	std::printf("----生存期間確認2\n");
	{
		auto v = my_foreach5(lvalue);
	}

	std::printf("--end of main\n");
}
