Quando ho eseguito il seguente programmaPerché la funzione << dell'operatore tra std :: ostream e char è una funzione non membro?
#include <iostream>
int main()
{
char c = 'a';
std::cout << c << std::endl;
std::cout.operator<<(c) << std::endl;
return 0;
}
ho preso l'uscita
a
97
Scavando ulteriormente a http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt, ho notato che std::ostream::operator<<()
non hai un sovraccarico che ha char
come il tipo di argomento. La funzione chiamata std::cout.operator<<(a)
viene risolta in std::ostream::operator<<(int)
, che spiega l'output.
Io parto dal presupposto che la funzione operator<<
tra il std::ostream
e char
è dichiarato altrove:
std::ostream& operator<<(std::ostream& out, char c);
In caso contrario, std::cout << a
risolverebbe a std::ostream::operator<<(int)
.
La mia domanda è perché è dichiarata/definita come una funzione non membro? Ci sono problemi noti che impediscono che funzioni come membro?
Forse a causa del parametro del modello del tipo di carattere? Questa funzione può avere la stessa implementazione ("efficiente") per qualsiasi tipo di carattere usando 'widen' delle impostazioni locali. – dyp
Argomento interessante. Potrebbe essere una ragione per cui [ciò che è stato discusso qui] (http://stackoverflow.com/questions/31230237/enforcing-unsigned-char-to-be-numerically-outputted-from-function-call) non funziona. –
@ dyp, non sembra molto convincente. –