当我写这样的代码时:
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
转换时,它会隐式转换为{ {1}}进行比较,但是当int
只有用户定义的foo
转换时,编译器不进行隐式转换,但string
运行良好。
答案 0 :(得分:1)
我认为问题是字符串不是基本类型。 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)