title: why std::move takes forward_reference instead of lvaue reference
body: <p>Just to confirm what I understood about <code>std::move</code></p>
  
  <p><code>std::move</code> - converts <code>T&amp;</code> to <code>T&amp;&amp;</code> so that the <code>T's</code> move constructor would kick in(if it exist otherwise the copy ctor will play its role unless we aren't externally deleted move ctor/assignment). </p>
  
  <p>when I've looked at the possible implementation of <code>std::move</code> it's like </p>
  
  <pre><code>template&lt;typename T&gt;
  typename remove_reference&lt;T&gt;::type&amp;&amp; move(T&amp;&amp; param)
  {
  using ReturnType =typename remove_reference&lt;T&gt;::type&amp;&amp;;
  return static_cast&lt;ReturnType&gt;(param);
  }
  </code></pre>
  
  <p>The reason it uses <code>remove_reference&lt;T&gt;</code> is because of the reference collapsing that applied over the forward_reference <code>T&amp;&amp;</code></p>
  
  <p>I just wonder why we need forward reference,couldn't we done that by </p>
  
  <pre><code>template&lt;typename T&gt;
  T&amp;&amp; moveInQuestion(T&amp; p){
    return static_cast&lt;T&amp;&amp;&gt;(p);
  }
  
  struct someType{};
  someType lvalref;
  static_assert(is_same&lt;decltype(moveInQuestion(lvalref)),decltype(std::move(lvalref))&gt;::value,"");
  </code></pre>
  
  <p><code>static_assert</code> hasn't failed.</p>
  
  <p>And I also believe that the value category that meant for <code>std::move</code> is an <code>lvalue</code> with this being the case could <code>moveInQuestion</code> possibly be better than <code>std::move</code>?</p>