title: Is std::move really needed on initialization list of constructor for heavy members passed by value?
body: <p>Recently I read an example from <a href="http://en.cppreference.com/w/cpp/container/vector/emplace_back" rel="noreferrer">cppreference.../vector/emplace_back</a>:</p>
  
  <pre><code>struct President
  {
      std::string name;
      std::string country;
      int year;
  
      President(std::string p_name, std::string p_country, int p_year)
          : name(std::move(p_name)), country(std::move(p_country)), year(p_year)
      {
          std::cout &lt;&lt; "I am being constructed.\n";
      }
  </code></pre>
  
  <p>My question: is this <code>std::move</code> really needed? My point is that this <code>p_name</code> is not used in the body of constructor, so, maybe, there is some rule in the language to use move semantics for it by default?</p>
  
  <p>That would be really annoying to add std::move on initialization list to every heavy member (like <code>std::string</code>, <code>std::vector</code>). Imagine hundreds of KLOC project written in C++03 - shall we add everywhere this <code>std::move</code>?</p>
  
  <p>This question: <a href="https://stackoverflow.com/questions/13793343/move-constructor-and-initialization-list">move-constructor-and-initialization-list</a> answer says:</p>
  
  <blockquote>
    <p>As a golden rule, whenever you take something by rvalue reference, you
    need to use it inside std::move, and whenever you take something by
    universal reference (i.e. deduced templated type with &amp;&amp;), you need to
    use it inside std::forward</p>
  </blockquote>
  
  <p>But I am not sure: passing by value is rather not universal reference? </p>
  
  <p><strong>[UPDATE]</strong></p>
  
  <p>To make my question more clear. Can the constructor arguments be treated as XValue - I mean expiring values?</p>
  
  <p>In this example AFAIK we do not use <code>std::move</code>:</p>
  
  <pre><code>std::string getName()
  {
     std::string local = "Hello SO!";
     return local; // std::move(local) is not needed nor probably correct
  }
  </code></pre>
  
  <p>So, would it be needed here:</p>
  
  <pre><code>void President::setDefaultName()
  {
     std::string local = "SO";
     name = local; // std::move OR not std::move?
  }
  </code></pre>
  
  <p>For me this local variable is expiring variable - so move semantics could be applied... And this similar to arguments passed by value....</p>