почему std :: cout можно преобразовать в void * при использовании g ++?

Почему можно броситьstd::ostream кvoid указатель? Я не знаю ни одного такого оператора преобразования вstd::ostream, Код ниже

#include <iostream>

int main()
{
    void *p = std::cout; // why does this work? 
}

Я задаю этот вопрос, так как видел оператора размещенияnew вызывается как

Foo* pFoo = new (std::cerr) Foo;

и понятия не имею, зачем писать такую ​​вещь.

PS: я компилирую с g ++ 4.9.2 с или без-std=c++11, лязг ++не принимает код.

PSS: Обнаружено, что из-за так называемой «проблемы с безопасным булом» (см. Ответ @ nicebyte), в до C ++ 11 avoid* оператор преобразования был определен дляstd::ostream, который затем был удален в C ++ 11. Тем не менее, мой код прекрасно компилируется в C ++ 11 с использованием g ++. Более того, Clang ++ отвергает это независимо от того, какую версию стандарта я использую, даже если-std=c++98, хотя я понимаю, что он должен принять, если скомпилирован как pre-C ++ 11.

Ответы на вопрос(2)

Ваш ответ на вопрос