title: When should I use boost call_traits::param_type versus a universal reference?
body: <p>In C++98 I got used to using <a href="http://www.boost.org/doc/libs/1_51_0/libs/utility/call_traits.htm" rel="nofollow">call_traits</a> in my templated functions to automatically pick the best way to pass parameters, e.g.:</p>
  
  <pre><code>template&lt;class T&gt;
  void foo(typename boost::call_traits&lt;T&gt;::param_type arg)
  {
      // .. do stuff with arg ..
  }
  </code></pre>
  
  <p>The advantage being that for primitives it would pass by value and for more complex objects it would pass by reference, so I'd have the least amount of overhead possible. C++11 now has a concept of 'universal references':</p>
  
  <pre><code>template&lt;class T&gt;
  void foo(T&amp;&amp; arg)
  {
      // .. do stuff with arg ..
  }
  </code></pre>
  
  <p>As I understand it I need to use a universal reference in order to get perfect forwarding with std::forward, so if I plan to use that the choice is clear. But when I don't plan to, which should I prefer? Will a universal reference always be as good or better?</p>