2017-02-20 3 views
6

Wenn ich schreibe Code wie folgt:Implizite Konvertierung und definierte Benutzer Umwandlung

struct foo { 
    operator int() const { return 1; } 
}; 
int main() { 
    foo a, b; 
    auto tmp = (a < b); 
} 

es funktioniert, aber während ich Code wie folgt schreiben:

struct foo { 
    operator string() const { return string("foo"); } 
}; 
int main() { 
    foo a, b; 
    auto tmp = (a < b); 
} 

Compiler (Klirren ++) sagt, dass error: invalid operands to binary expression ('foo' and 'foo')

ich frage mich, warum sowohl als string Art und int Typ haben Vergleichsoperatoren, aber wenn foo hat ein Benutzer defi ned int Umwandlung, wird es implizit zu int konvertieren, um zu vergleichen, aber wenn foo nur eine benutzerdefinierte string Umwandlung hat, tut Compiler nicht implizite Konvertierung obwohl (string)a<(string)b funktioniert gut.

+1

ich nicht kenne die Regel, die das verursacht, aber am meisten l ikely hat es etwas mit 'zu tun int' ein in Art – user463035818

+4

verwandt/Betrogene gebaut: http://stackoverflow.com/questions/42252023/implicit-conversion-operator-priority – NathanOliver

+0

@NathanOliver imho Frage ist nicht wirklich eine Betrogene, aber Die Antwort erklärt auch genau diese – user463035818

Antwort

1

ich glaube, das Problem ist, dass String ist kein Grundtyp. std::string ist eine Spezialisierung einer Vorlage, speziell std::basic_string<char>

So operator < als

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

definiert ist mit Es funktioniert:

auto tmp = (static_cast<std::string>(a) < static_cast<std::string>(b)); 

Dann operator < wird:

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

und weil benutzerdefinierte Konvertierung nicht für Template-Funktion Spezialisierung berücksichtigt. Sehen Sie diese im Zusammenhang Antwort: [http://stackoverflow.com/questions/42252023/implicit-conversion-operator-priority/42253006#42253006]. – Oliv