title: different behaviors between Eigen::Ref and Eigen::MatrixBase
body: <p>I am wondering why the following code generates a compile-time error:</p>
  
  <pre><code>void f(const double e) {}
  
  void f(const Eigen::Ref&lt;const MatrixX&lt;double&gt;&gt;&amp; g) {}
  
  int main {
    Eigen::Matrix&lt;double, 2, 1&gt; m1;
    Eigen::Matrix&lt;double, 2, 1&gt; m2;
    m1 &lt;&lt; 1.0, 2.0;
    m2 &lt;&lt; 1.0, 2.0;
    f(m1.transpose() * m2);  // error: call to 'f' is ambiguous
  }
  </code></pre>
  
  <p>while the following one doesn't.</p>
  
  <pre><code>void f(const double e) {}
  
  template &lt;typename Derived&gt;
  void f(const Eigen::MatrixBase&lt;Derived&gt;&amp; m) {}
  
  int main {
    Eigen::Matrix&lt;double, 2, 1&gt; m1;
    Eigen::Matrix&lt;double, 2, 1&gt; m2;
    m1 &lt;&lt; 1.0, 2.0;
    m2 &lt;&lt; 1.0, 2.0;
    f(m1.transpose() * m2);  // no error
  }
  </code></pre>