Почему можно наложить std::ostream
на указатель void
? Я не знаю ни одного такого оператора преобразования в std::ostream
. Код нижеПочему std :: cout конвертируется в void * при использовании g ++?
#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 в), в предварительно C++ 11 оператор а void*
преобразования был определен для std::ostream
, который затем был удален в C++ 11 , Тем не менее, мой код компилируется в C++ 11, используя g ++. Более того, clang ++ отвергает его независимо от того, какую версию стандарта я использую, даже с -std=c++98
, хотя я понимаю, что он должен принимать, если скомпилирован как pre-C++ 11.
'new (std :: cerr) Foo'? Какие. . Ад. – Quentin
@Quentin :) Вот что я сказал себе, когда увидел это. – vsoftco
Мне бы это понравилось, если бы вы могли предоставить источник. Я могу только думать о ужасных вещах, к которым это может привести. – Quentin