почему 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.