2017-02-20 9 views
6

Когда я пишу такой код:неявное преобразование и определенные пользователем преобразования

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); 
} 

Compiler (лязг ++) говорит, что error: invalid operands to binary expression ('foo' and 'foo')

Интересно, почему, поскольку оба типа string и int имеют операторы сравнения, но когда foo имеет пользовательский указатель ned int конвертировать, он будет подразумевать преобразование в int, чтобы сравнить, однако, когда foo имеет только определенный пользователем string преобразование, компилятор не делает неявного преобразования, хотя (string)a<(string)b работает хорошо.

+1

Я не знать правило, которое вызывает это, но большинство l Вероятно, это связано с тем, что 'int' является встроенным типом – user463035818

+4

, связанным/обманом: http://stackoverflow.com/questions/42252023/implicit-conversion-operator-priority – NathanOliver

+0

@NathanOliver imho question на самом деле не обман, но ответ точно объясняет и этот – user463035818

ответ

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) 
+2

И поскольку преобразование, определенное пользователем, не рассматривается для специализации шаблона. См. Этот ответ: [http://stackoverflow.com/questions/42252023/implicit-conversion-operator-priority/42253006#42253006]. – Oliv