fork(2) download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. template<typename T>
  5. void forwarder_impl(T&& x, std::true_type, std::true_type)
  6. {
  7. std::cout << "rvalue reference to const\n";
  8. }
  9. template<typename T>
  10. void forwarder_impl(T&& x, std::true_type, std::false_type)
  11. {
  12. std::cout << "rvalue reference to non-const\n";
  13. }
  14. template<typename T>
  15. void forwarder_impl(T&& x, std::false_type, std::true_type)
  16. {
  17. std::cout << "lvalue reference to const\n";
  18. }
  19. template<typename T>
  20. void forwarder_impl(T&& x, std::false_type, std::false_type)
  21. {
  22. std::cout << "lvalue reference to non-const\n";
  23. }
  24.  
  25. template<typename T>
  26. void forwarder(T&& x)
  27. {
  28. forwarder_impl(
  29. std::forward<T>(x),
  30. typename std::is_rvalue_reference<decltype(x)>::type(),
  31. typename std::is_const<typename std::remove_reference<decltype(x)>::type>::type()
  32. );
  33. }
  34.  
  35. int main()
  36. {
  37. const int x = 42;
  38. int y = 42;
  39. forwarder(std::move(x));
  40. forwarder(std::move(y));
  41. forwarder(x);
  42. forwarder(y);
  43. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
rvalue reference to const
rvalue reference to non-const
lvalue reference to const
lvalue reference to non-const