Modifica: ho riformattato il post per essere più chiaro.Perché l'aggiunta di due letterali stringa non utilizza l'operatore + (const string &, const string &)?
Perché questo lavoro:
struct A {};
struct B {
B(A){}
};
void operator+(const B&, const B&) {}
int main()
{
A a1, a2;
a1 + a2;
}
e questo non lo fa?
struct B {
B(const char*){}
};
void operator+(const B&, const B&) {} //error: invalid operands of types 'const char [6]' and 'const char [6]' to binary 'operator+'|
int main()
{
"Hello" + "world";
}
In sostanza, nel primo esempio a1
e a2
sia convertire in B
oggetti attraverso la conversione implicita e utilizzare il operator+(const B&, const B&)
da aggiungere.
Seguendo da questo esempio, mi sarei aspettato "Hello"
e "world"
convertire in B
oggetti, sempre attraverso il costruttore implicita, e utilizzare operator+(const B&, const B&)
per aggiungere gli uni agli altri. Invece c'è un errore, che indica che le stringhe in stile C non tentano una conversione definita dall'utente in B
per aggiungere. Perchè è questo? Esiste una proprietà fondamentale che impedisce questo?
Non si è trattato di 'std :: string' con' "stack" + "overflow"; '. –
@ πάνταῥεῖ È a conoscenza di ciò, la domanda è perché la conversione implicita in 'std :: string' non risolve il problema per lui. –
Il tuo esempio minimale è un po 'off poiché 'const char *' non ha alcun operatore di conversione, ma la conversione avviene tramite il costruttore 'std :: string's. [Questo] (http://coliru.stacked-crooked.com/a/1c4aafeb95886b92) sarebbe un po 'più adatto. –