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

时间:2017-02-20 12:02:46

标签: c++ implicit-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转换时,它会隐式转换为{ {1}}进行比较,但是当int只有用户定义的foo转换时,编译器不进行隐式转换,但string运行良好。

1 个答案:

答案 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)