2015-11-06 10 views
9

Questa è in parte ispirata alla domanda this. Quando scrivo il codice:Conversione implicita con operatore

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

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

"test" è implicitamente convertito const char*-std::string, e ottengo i risultati attesi. Tuttavia, quando provo questo:

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

ottengo l'errore del compilatore, invalid operands of types 'int' and 'const char [2]' to binary 'operator*'. "a" non è stato convertito implicitamente in std::string qui, invece è rimasto un const char*. Perché il compilatore è in grado di determinare la necessità di una conversione implicita nel caso di una chiamata di funzione, ma non nel caso di un operatore?

risposta

8

Infatti, gli operatori hanno regole diverse da altri tipi di funzioni.

Se non operando di un operatore in un'espressione ha un tipo che è una classe o un'enumerazione, l'operatore si presume essere dotato di un operatore e interpretati secondo Clausola 5.

([over.match.oper]/1)

+3

Normalmente direi "Aggiungi nella clausola 5 per completezza". ma le pagine di cinquanta-qualcosa sembrano eccessive. – user4581301

+0

In effetti, la conversione implicita funziona come previsto per i tipi non primitivi; vedi [qui] (http://ideone.com/K4K2vS). –

Problemi correlati