consideri il seguente esempio minimale:Ordine di risoluzione di sovraccarico dell'operatore che coinvolge provvisori
#include <iostream>
using namespace std;
class myostream : public ostream {
public:
myostream(ostream const &other) :
ostream(other.rdbuf())
{ }
};
int main() {
cout << "hello world" << endl;
myostream s(cout);
s << "hello world" << endl;
myostream(cout) << "hello world" << endl;
}
L'uscita, sia sul g ++ e Visual C++, è
hello world
hello world
0x4012a4
La versione che scrive ad un oggetto temporaneo , myostream(cout)
, sembra preferire l'operatore membro ostream::operator<<(void *)
, anziché l'operatore libero operator<<(ostream &, char *)
. Sembra fare la differenza se l'oggetto ha o meno un nome.
Perché succede? E come posso prevenire questo comportamento?
Edit: Perché succede è ormai chiaro da varie risposte. Per quanto riguarda come evitare ciò, sembra interessante quanto segue:
class myostream : public ostream {
public:
// ...
myostream &operator<<(char const *str) {
std::operator<<(*this, str);
return *this;
}
};
Tuttavia, questo si traduce in tutti i tipi di ambiguità.
Si potrebbe considerare questa risposta ad un'altra domanda come un punto di partenza per qualcosa è almeno simile a ciò che si desidera ottenere: http://stackoverflow.com/questions/469696/questo-è-suo-molto-utile-cc-snippet/470999#470999 Dovrete aggiungere funzionalità alla classe accettare i modificatori di input (std :: hex, std :: endl ...), ma non dovrebbe essere troppo difficile. –