gpt4 book ai didi

c++ - 隐式转换和用户定义的转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:08 25 4
gpt4 key购买 nike

当我写这样的代码时:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com