如果我将struct A
定义为:
struct A {
const char *data;
operator const char * () const { return data; }
friend bool operator== (const A &s1, const char *s2)
{ return /* typical string comparison result */; }
};
我写A{"hello"} == "test2"
,是A::operator==
吗?标准中的内容表明(以及为什么A
隐式转换为const char *
?
"test2" == A{"hello"}
怎么样?在这种情况下,A
是否已转换?
编辑:如果struct A
还有成员,那该怎么办?
friend bool operator== (const char *s1, const A &s2)
答案 0 :(得分:4)
当你这样做时
A{"hello"} == "test2"
我们对operator==
执行重载解析。首先,我们通过名称查找找到了可行的候选者([over.match.viable]):
operator==(A const&, const char*); // yours
operator==(const char*, const char*); // built-in
接下来,我们确定哪个候选者具有最佳的隐式转换序列。这是[over.match.best]中的第一个决胜局:
鉴于这些定义,如果对于所有参数 i ,可行函数
F1
被定义为更好函数而不是另一个可行函数F2
。 ,ICS i (F1)不是比ICS i (F2)更差的转换序列,然后是 (1.3) - 对于某些参数 j ,ICS j (F1)是比ICS j (F2)更好的转换序列,或者,如果不是那样,[...]
两个运算符在第二个参数上都是精确匹配。在第一个参数上,您的operator==
是完全匹配,而内置需要用户定义的转换。精确匹配是最好的转换,用户定义是最差的 - 因此,您的转换序列更好,并成为最佳的可行功能。
从广义上讲,A
并未隐式转换为const char*
,因为有一个更好的选择,而不是必须的。
当你这样做时:
"test2" == A{"hello"};
您的候选人不可行 - 没有从const char*
到A const&
(第一个参数)的隐式转换,因此唯一可行的候选者是const char*
的内置比较,这需要用户定义的从A
到const char*
的转换。
如果您希望调用A::operator==
,则必须为operator==(const char*, A const&)
添加新的重载。