fork download
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. struct value {
  5. T val;
  6. value(T&& t) : val(std::forward<T>(t)) { }
  7. };
  8.  
  9. //この関数は右辺値も左辺値も受けます。
  10. //左辺値を受けたらその値を使い、右辺値だったら内部で確保したコピーを使います。
  11. //ある変数をそのまま関数に渡してもいいですし、コピーとって右辺値にして渡してもいいです。
  12. //コピーとって右辺値にする一番手っ取り早い方法は、同一の型にキャストすることです。(VCではダメ)
  13. template <typename T>
  14. value<T> makeValue(T&& x)
  15. {
  16. value<T> v(std::forward<T>(x));
  17. return v;
  18. }
  19.  
  20.  
  21. value<int> helium() {
  22. int i = 808;
  23. auto v1 = makeValue(i); //左辺値
  24. auto v2 = makeValue((int)i); //右辺値(VCではダメ)
  25. std::cout << "v1.val = " << v1.val << std::endl;
  26. std::cout << "v2.val = " << v2.val << std::endl;
  27. i = 20140108;
  28. std::cout << "--------------ここで i の値を変更------------" <<std::endl;
  29. std::cout << "v1.val = " << v1.val << "(変化)" <<std::endl;
  30. std::cout << "v2.val = " << v2.val << "(不変)" <<std::endl;
  31. std::cout << "v2はreturnできるけどv1は i の寿命に縛られてるから無理" <<std::endl;
  32. return v2;
  33. }
  34.  
  35. int main() {
  36. value<int> v = helium();
  37. std::cout << "--------------value<int>を受け取った------------" <<std::endl;
  38. std::cout << "v.val = " << v.val << std::endl;
  39. return 0;
  40. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
v1.val = 808
v2.val = 808
--------------ここで i の値を変更------------
v1.val = 20140108(変化)
v2.val = 808(不変)
v2はreturnできるけどv1は i の寿命に縛られてるから無理
--------------value<int>を受け取った------------
v.val = 808