Почему можно нарисовать указатель 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
. clang++ не принимает код.
PSS: обнаружено, что из-за так называемой "безопасной проблемы bool" (см. ответ @nicebyte) в pre С++ 11 был определен оператор преобразования void*
для std::ostream
, который затем был удален в С++ 11. Тем не менее, мой код компилируется в С++ 11, используя g++. Более того, clang++ отвергает его независимо от того, какую версию стандарта я использую, даже с -std=c++98
, хотя я понимаю, что он должен принимать, если скомпилирован как pre-С++ 11.