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