title: Issue with forwarding copy constructor
body: <p>Anyone know why the forwarding copy ctor does not work?</p>
  
  <p>Compiler error about one type being a vector and other a stack ???</p>
  
  <pre><code>#include "stdafx.h"
  #include &lt;iostream&gt;
  #include &lt;vector&gt;
  #include &lt;type_traits&gt;
  
  using namespace std;
  
  template&lt;class T&gt;
  class stack{
  public:
      stack();
  
      template&lt;class X&gt;
      stack(X&amp;&amp; other);
  
      template&lt;typename X&gt;
      void push(X&amp;&amp; element);
  
      T const &amp; top() const;
  
      void pop();
  
      inline std::size_t const size() const;
  
      typedef std::vector&lt;T&gt; vector_type;
  
  private:
      std::vector&lt;T&gt; elements;
  };
  
  
  template&lt;class T&gt;
  stack&lt;T&gt;::stack(){}
  
  template&lt;class T&gt;
  template&lt;class X&gt;
  stack&lt;T&gt;::stack(X&amp;&amp; other) : elements(std::forward&lt;typename X&gt;(other.elements)){
  
  }
  
  template&lt;class T&gt;
  template&lt;class X&gt;
  void stack&lt;T&gt;::push(X&amp;&amp; element){
      this-&gt;elements.push_back(std::forward&lt;X&gt;(element));
  }
  
  template&lt;class T&gt;
  T const &amp; stack&lt;T&gt;::top() const{
      return this-&gt;elements[this-&gt;elements.size() -1];
  }
  
  template&lt;class T&gt;
  inline std::size_t const stack&lt;T&gt;::size() const{
      return this-&gt;elements.size();
  }
  
  template&lt;class T&gt;
  void stack&lt;T&gt;::pop(){
      this-&gt;elements.pop_back();
  }
  
  template&lt;class T,int N&gt;
  stack&lt;T&gt; get_stack_of_n_defaults(){
  
      stack&lt;T&gt; s;
  
      for(int i = 0; i &lt; N; ++i){
          s.push( T()); // should pass by rvalue ref;
      }
  
      return s;
  
  }
  
  
  int main()
  {
  
      stack&lt;int&gt; s = get_stack_of_n_defaults&lt;int,5&gt;();
  
      for(int i = 0; i &lt;= 10; ++i){
          s.push(i);
      }
  
      cout &lt;&lt; s.size() &lt;&lt; endl;
  
      for(int i = 0; i &lt;= 10; ++i){
          cout &lt;&lt; s.top() &lt;&lt; endl;;
          s.pop();
      }
  
      cout &lt;&lt; s.size() &lt;&lt; endl;
  
      return 0;
  }
  </code></pre>