title: literal `0` being a valid candidate for int and const string& overloads causes ambiguous call
body: <p>I fixed a bug recently. </p>
  
  <p>In the following code, one of the overloaded function was const and the other one was not. The issue will be fixed by making both functions const. </p>
  
  <p>My question is why compiler only complained about it when the parameter was 0. </p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;string&gt;
  
  class CppSyntaxA
  {
  public:
      void f(int i = 0) const { i++; }
      void f(const std::string&amp;){}
  };
  
  int main()
  {
      CppSyntaxA a;
      a.f(1);  // OK
      //a.f(0);  //error C2666: 'CppSyntaxA::f': 2 overloads have similar conversions
      return 0;
  }
  </code></pre>