fork download
  1. #include <cstdio> // for printf.
  2. #include <algorithm>
  3.  
  4. struct unko
  5. {
  6. unko() { std::printf("コンストラクター\n"); }
  7. unko(const unko &) { std::printf("copy\n"); }
  8. unko(unko &&) {std::printf("move\n"); }
  9. ~unko() { std::printf("デストラクター\n"); }
  10. int big_data[1000];
  11. };
  12.  
  13. template<typename T>
  14. auto my_foreach1(T t) -> T
  15. {
  16. return t;
  17. }
  18.  
  19. template<typename T>
  20. auto my_foreach2(T t) -> T
  21. {
  22. return std::move(t);
  23. }
  24.  
  25. template<typename T>
  26. auto my_foreach3(T &&t) -> T
  27. {
  28. return t;
  29. }
  30. /*
  31. template<typename T>
  32. auto my_foreach4(T &&t) -> T
  33. {
  34. return std::move(t);
  35. }
  36. */
  37. template<typename T>
  38. auto my_foreach5(T &&t) -> T &&
  39. {
  40. return std::forward<T>(t);
  41. }
  42.  
  43. int main()
  44. {
  45. unko lvalue;
  46.  
  47. std::printf("\n----1\n");
  48. my_foreach1(unko{});
  49. std::printf("--\n");
  50. my_foreach1(lvalue);
  51.  
  52. std::printf("\n----2\n");
  53. my_foreach2(unko{});
  54. std::printf("--\n");
  55. my_foreach2(lvalue);
  56.  
  57. std::printf("\n----3\n");
  58. my_foreach3(unko{});
  59. std::printf("--\n");
  60. my_foreach3(lvalue);
  61.  
  62. std::printf("\n----5\n");
  63. my_foreach5(unko{});
  64. std::printf("--\n");
  65. my_foreach5(lvalue);
  66.  
  67. std::printf("----生存期間確認1\n");
  68. {
  69. auto v = my_foreach5(unko{});
  70. }
  71.  
  72. std::printf("----生存期間確認2\n");
  73. {
  74. auto v = my_foreach5(lvalue);
  75. }
  76.  
  77. std::printf("--end of main\n");
  78. }
  79.  
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
コンストラクター

----1
コンストラクター
move
デストラクター
デストラクター
--
copy
move
デストラクター
デストラクター

----2
コンストラクター
move
デストラクター
デストラクター
--
copy
move
デストラクター
デストラクター

----3
コンストラクター
copy
デストラクター
デストラクター
--

----5
コンストラクター
デストラクター
--
----生存期間確認1
コンストラクター
move
デストラクター
デストラクター
----生存期間確認2
copy
デストラクター
--end of main
デストラクター