title: Why doesn't the standard consider a template constructor as a copy constructor?
body: <p>Here's the definition of copy constructor, <a href="http://eel.is/c++draft/class.copy.ctor#1" rel="noreferrer">[class.copy.ctor/1]</a>:</p>
  
  <blockquote>
    <p>A non-template constructor for class X is a copy constructor if its first parameter is of type X&amp;, const X&amp;, volatile X&amp; or const volatile X&amp;, and either there are no other parameters or else all other parameters have default arguments ([dcl.fct.default]).</p>
  </blockquote>
  
  <p>Why does the standard exclude templates as copy constructors?</p>
  
  <p>In this simple example, both constructors are copy constructors:</p>
  
  <pre><code>struct Foo {
      Foo(const Foo &amp;); // copy constructor
      Foo(Foo &amp;);       // copy constructor
  };
  </code></pre>
  
  <p>See this similar example:</p>
  
  <pre><code>struct Foo {
       Foo() = default;
  
       template &lt;typename T&gt;
       Foo(T &amp;) {
           printf("here\n");
       }
  };
  
  int main() {
      Foo a;
      Foo b = a;
  }
  </code></pre>
  
  <p>In this example, <code>here</code> will be printed. So it seems that my template constructor is a copy constructor, at least it behaves like one (it is called in a context where copy constructors are usually called).</p>
  
  <p>Why is the "non-template" requirement there in the text?</p>