本帖最后由 Croper 于 2020-1-17 00:56 编辑
我把刚才的说完把。。现在在这个代码里加入一个类,
拥有int和string的构造函数,并且重载了operator==struct A {
A(int) {};
A(string) {};
};
bool operator ==(const A&, const A&)
{
return true;
};
template <typename T1,typename T2,typename=decltype(declval<T1>()==declval<T2>())>
bool Equal(const T1& t1, const T2& t2) { //能调用==的变量进入这个分支
return t1 == t2;
}
bool Equal(...) { //不能调用==的变量进入这个分支
return false;
}
int main() {
bool a = Equal(1, 1.000);
bool b = Equal(0, string());
system("pause");
}
这个时候Equal(0,string())就变成true了。。因为Erqual和string都转换成了A,单步调式可以看出来的。 |