【问题标题】:Implicit conversion and user defined conversion隐式转换和用户定义的转换
【发布时间】:2017-02-20 12:02:45
【问题描述】:

当我写这样的代码时:

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 进行比较,但是当@ 987654331@ 只有一个用户定义的string 转换,编译器不做隐式转换虽然(string)a&lt;(string)b 工作得很好。

【问题讨论】:

  • 我不知道导致这种情况的规则,但很可能与 int 是内置类型有关
  • @NathanOliver imho 问题并不是真正的骗子,但答案也完美地解释了这个
  • @tobi303 是的,这就是我自己没有关闭它的原因。不确定它是否应该作为骗子关闭,但答案确实解释了问题。

标签: c++ implicit-conversion


【解决方案1】:

我认为问题在于字符串不是基本类型。 std::string 是模板的特化,具体来说是std::basic_string&lt;char&gt;

所以operator &lt; 被定义为

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 &lt;就变成了:

bool std::operator< <char, std::char_traits<char>, std::allocator<char>>(const std::string &_Left, const std::string &_Right)

【讨论】:

猜你喜欢
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
相关资源
最近更新 更多