fork(1) download
  1. #include <iostream>
  2. #include <typeinfo>
  3.  
  4. template<typename T>
  5. void tester(T&)
  6. {
  7. std::cout << "tester(" << typeid(T).name() << "&):\n\tlvalue reference - " << std::boolalpha <<
  8. std::is_lvalue_reference<T>::value << "\n\trvalue reference - " << std::is_rvalue_reference<T>::value << '\n';
  9. }
  10.  
  11. template<typename T>
  12. void tester(T&&)
  13. {
  14. std::cout << "tester(" << typeid(T).name() << "&&):\n\tlvalue reference - " << std::is_lvalue_reference<T>::value
  15. << "\n\trvalue reference - " << std::is_rvalue_reference<T>::value << '\n';
  16. }
  17.  
  18. int main()
  19. {
  20. std::cout << "How on Earth that is_rvalue_reference and is_lvalue_reference work?!\n";
  21. int intval{ 123 }; int& intref{ intval }; int const&& intrref{ 123 };
  22. tester(intval); tester(intref); tester(intrref); // not a single true, thats wrong somehow
  23. tester(std::move(intval)); tester(std::move(intref)); tester(std::move(intrref));
  24.  
  25.  
  26.  
  27. return 0;
  28. }
Success #stdin #stdout 0s 4376KB
stdin
Standard input is empty
stdout
How on Earth that is_rvalue_reference and is_lvalue_reference work?!
tester(i&):
	lvalue reference - false
	rvalue reference - false
tester(i&):
	lvalue reference - false
	rvalue reference - false
tester(i&):
	lvalue reference - false
	rvalue reference - false
tester(i&&):
	lvalue reference - false
	rvalue reference - false
tester(i&&):
	lvalue reference - false
	rvalue reference - false
tester(i&&):
	lvalue reference - false
	rvalue reference - false