#include <iostream>
#include <typeinfo>
using std::cout;

// проверяю написанное в https://h...content-available-to-author-only...r.com/post/322132/
// (часть Сжатие ссылок и универсальные ссылки)

template<typename T>
void tester(T&)
{
  cout << "tester(" << typeid(T).name() << "&):\n\tlvalue reference - " << std::boolalpha <<
    std::is_lvalue_reference<T>::value << "\n\trvalue reference - " << std::is_rvalue_reference<T>::value << '\n';
}

template<typename T>
void tester(T&&)
{
  cout << "tester(" << typeid(T).name() << "&&):\n\tlvalue reference - " << std::boolalpha <<
    std::is_lvalue_reference<T>::value << "\n\trvalue reference - " << std::is_rvalue_reference<T>::value << '\n';
}

class T{};

void tests()
{
  T value{};
  T& ref{ value};
  cout << "Testing lvalue reference.\t";	tester(ref);	tester<T>(value);
  cout << "Testing rvalue reference.\t";	tester(T{});	tester<T>(T{});
  cout << "Testing incomperhensible stuff.\t";	tester(value);	tester<T&>(value);
}


int main() 
{
  tests();
  return 0;
}