title: Why not always use std::forward?
body: <p>The distinction between <code>std::move</code> and <code>std::forward</code> is well known, we use the latter to preserve the value category of a forwarded object and the former to cast to rvalue reference in order to enable move semantics. </p>
  
  <p>In <strong>effective modern C++</strong>, a guideline exists that states </p>
  
  <blockquote>
    <p>use <code>std::move</code> on rvalue references, <code>std::forward</code> on universal references.</p>
  </blockquote>
  
  <p>Yet in the following scenario (<em>and scenarios where we don't want to change value category</em>),</p>
  
  <pre><code>template &lt;class T&gt;
  void f(vector&lt;T&gt;&amp;&amp; a)
  {
      some_func(std::move(a)); 
  }
  </code></pre>
  
  <p>where <code>a</code> is not a forwarding reference but a simple rvalue reference, wouldn't it be exactly the same to do the following?</p>
  
  <pre><code>template &lt;class T&gt;
  void f(vector&lt;T&gt;&amp;&amp; a)
  {
      some_func(std::forward&lt;decltype(a)&gt;(a)); 
  }
  </code></pre>
  
  <p>Since this can be easily encapsulated in a macro like this,</p>
  
  <pre><code>#define FWD(arg) std::forward&lt;decltype(arg)&gt;(arg)
  </code></pre>
  
  <p>isn't it convenient to always use this macro definition like so?</p>
  
  <pre><code>void f(vector&lt;T&gt;&amp;&amp; a)
  {
      some_func(FWD(a)); 
  }
  </code></pre>
  
  <p>Aren't the two ways of writing this exactly equivalent?</p>