title: Does = make_pair Invoke the Copy Constructor?
body: <p>Normally the <code>=</code> in a variable declaration is treated by the compiler as move construction. For example:</p>
  
  <pre><code>vector&lt;int&gt; foo = vector&lt;int&gt;(13, 0);
  </code></pre>
  
  <p>Will call the <code>vector&lt;int&gt;::vector&lt;int&gt;(vector&lt;int&gt;&amp;&amp;)</code> constructor.</p>
  
  <p>How does this work with <code>make_pair</code>? Am I constructing a temporary and moving it if I do:</p>
  
  <pre><code>pair&lt;int, int&gt; foo = make_pair(13, 0);
  </code></pre>
  
  <p>Obviously the consequence becomes more significant as the types in the <code>pair</code> are something heavier than <code>int</code>s, but the question remains the same. Is a temporary constructed here? If <code>make_pair</code> forces a temporary, I assume I could call:</p>
  
  <pre><code>pair&lt;int, int&gt; foo = pair(13, 0);
  </code></pre>
  
  <p>Either way, what about when the types can be implicitly converted, but are not identical? For example:</p>
  
  <pre><code>pair&lt;string, int&gt; foo = make_pair&lt;"Hello World!", 13&gt;;
  </code></pre>
  
  <p>Or:</p>
  
  <pre><code>pair&lt;string, int&gt; foo = pair("Hello World!", 13);
  </code></pre>
  
  <p>Is a temporary <code>pair&lt;const char*, int&gt;</code> created in this situation?</p>