2015-11-06 17 views
9

Dies ist teilweise inspiriert von this Frage. Wenn ich den Code schreiben:Implizite Konvertierung mit Operator

void test(std::string inp) 
{ 
    std::cout << inp << std::endl; 
} 

int main(void) 
{ 
    test("test"); 
    return 0; 
} 

"test" implizit const char*-std::string umgewandelt, und ich die erwartete Ausgabe zu erhalten. Allerdings, wenn ich versuche Sie dies:

std::string operator*(int lhs, std::string rhs) 
{ 
    std::string result = ""; 

    for(int i = 0; i < lhs; i++) 
    { 
    result += rhs; 
    } 

    return result; 
} 

int main(void) 
{ 
    std::string test = 5 * "a"; 
    return 0; 
} 

Ich erhalte den Compiler-Fehler, invalid operands of types 'int' and 'const char [2]' to binary 'operator*'. "a" wurde hier nicht implizit in std::string konvertiert, stattdessen blieb es ein const char*. Warum kann der Compiler im Falle eines Funktionsaufrufs die Notwendigkeit einer impliziten Konvertierung feststellen, nicht jedoch für den Fall eines Operators?

Antwort

8

Tatsächlich haben Operatoren andere Regeln als andere Arten von Funktionen.

Wenn kein Operand eines Operators in einem Ausdruck einen Typ hat, die eine Klasse oder eine Aufzählung ist, wird der Bediener angenommen, ein Bediener und interpretiert in eingebautem sein Klausel gemäß 5.

([over.match.oper]/1)

+3

Normalerweise würde ich sagen, "Add in Abschnitt 5 für die Vollständigkeit." aber fünfzig Seiten scheinen übertrieben. – user4581301

+0

Tatsächlich funktioniert implizite Konvertierung wie erwartet für nicht-primitive Typen; siehe [hier] (http://ideone.com/K4K2vS). –