Perché è possibile trasmettere un std::ostream
a un puntatore void
? Non sono a conoscenza di alcun operatore di conversione di questo tipo in std::ostream
. Codice qui sottoperché std :: cout convertible to void * se si utilizza g ++?
#include <iostream>
int main()
{
void *p = std::cout; // why does this work?
}
Sto chiedendo a questa domanda da quando ho visto un operatore di posizionamento new
invocato come
Foo* pFoo = new (std::cerr) Foo;
e non hanno assolutamente idea del perché si potrebbe scrivere una cosa del genere.
PS: Sto compilando con g ++ 4.9.2 con o senza -std=c++11
. clang ++ non accetta il codice.
PSS: Abbiamo scoperto che a causa del cosiddetto "problema bool sicuro" (vedi @ risposta di nicebyte), in pre C++ 11 un operatore void*
conversione è stato definito per std::ostream
, che è stato poi rimosso in C++ 11 . Tuttavia, il mio codice si compila bene in C++ 11 usando g ++. Più di questo, clang ++ lo rifiuta non importa quale versione dello standard io uso, anche con -std=c++98
, anche se la mia comprensione è che dovrebbe accettare se compilato come pre-C++ 11.
'nuovo (std :: cerr) Foo'? Che cosa. Il. Inferno. – Quentin
@Quentin :) questo è quello che ho detto a me stesso quando l'ho visto. – vsoftco
Mi piacerebbe se potessi fornire la fonte. Posso solo pensare alle cose orribili che questo potrebbe portare a. – Quentin