作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我写这样的代码时:
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)
关于c++ - 隐式转换和用户定义的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42344086/
我是一名优秀的程序员,十分优秀!