隐式转换和用户定义的转换
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)
当我这样写代码时:
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)