考虑以下两个类:
#define PRETTY(x) (std::cout << __PRETTY_FUNCTION__ << " : " << (x) << '\n')
struct D;
struct C {
C() { PRETTY(this);}
C(const C&) { PRETTY(this);}
C(const D&) { PRETTY(this);}
};
struct D {
D() { PRETTY(this);}
operator C() { PRETTY(this); return C();}
};
Run Code Online (Sandbox Code Playgroud)
我们对两个构造函数之间的重载解析感兴趣:
C::C(const C&);
C::C(const D&);
Run Code Online (Sandbox Code Playgroud)
此代码按预期工作:
void f(const C& c){ PRETTY(&c);}
void f(const D& d){ PRETTY(&d);}
/*--------*/
D d;
f(d); //calls void f(const D& d)
Run Code Online (Sandbox Code Playgroud)
因为void f(const D& d)是一个更好的匹配.
但是:
D d;
C c(d); …Run Code Online (Sandbox Code Playgroud)