C ++ operator ==和隐式转换解析

时间:2016-07-13 15:35:48

标签: c++ operator-overloading implicit-conversion overload-resolution

如果我将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)

1 个答案:

答案 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*的内置比较,这需要用户定义的从Aconst char*的转换。

如果您希望调用A::operator==,则必须为operator==(const char*, A const&)添加新的重载。