#include <algorithm>
#include <iostream>

struct A
{
  A(){std::cout << "C";}
  ~A(){std::cout << "D";}
};

A const& hi(A const& a)
{
  return a;
}

int main()
{
  {
    A const& i = hi(A());
    std::cout << " hi ";
  }
  std::cout << "\n--\n";
  {
    A const& i = std::move(A());
    std::cout << " hi ";
  }
  std::cout << "\n--\n";
  {
    A const& i = static_cast<A const&>(A());
    std::cout << " hi ";
  }
  std::cout << "\n--\n";
  {
    A const& i = static_cast<A&&>(A());
    std::cout << " hi ";
  }
}