The definition of a member function shall not contain default arguments that produce a signature identical to that of the implicitly-declared copy constructor for the corresponding class/structure.


Compilers are not required to diagnose this ambiguity.

Example 1

  struct X {
      X(const X&, int);
      X::X(const X& x, int i =0) { /* ... */ }

If the class definition does not explicitly declare a copy constructor, one is declared implicitly. Thus, for the detailed class definition a copy constructor is implicitly-declared. If the user-declared constructor is later defined, as detailed on line #3, then any use of X’s copy constructor is ill-formed because of the ambiguity.