隐式转换和用户定义的转换

Implicit conversion and user defined conversion

当我这样写代码时:

struct foo {
    operator int() const { return 1; }
};
int main() {
    foo a, b;
    auto tmp = (a < b);
}

它有效,但是当我这样写代码时:

struct foo {
    operator string() const { return string("foo"); }
};
int main() {
    foo a, b;
    auto tmp = (a < b);
}

编译器(clang++)说 error: invalid operands to binary expression ('foo' and 'foo')

我想知道为什么,string类型和int类型都有比较运算符,但是当foo有用户定义的int转换时,它会隐式转换与 int 进行比较,但是当 foo 仅具有用户定义的 string 转换时,编译器不会进行隐式转换,尽管 (string)a<(string)b 运行良好。

我认为问题在于字符串不是基本类型。 std::string 是模板的特化,特别是 std::basic_string<char>

所以operator <定义为

template <class CharT, class Traits, class Allocator>
    bool operator< (const std::basic_string<CharT, Traits, Allocator> &_Left,  const std::basic_string<CharT, Traits, Allocator> &_Right);

它适用于:

auto tmp = (static_cast<std::string>(a) < static_cast<std::string>(b));

然后operator <变成:

bool std::operator< <char, std::char_traits<char>, std::allocator<char>>(const std::string &_Left, const std::string &_Right)