Если вы передадите какой-либо указатель на поток C ++, его адрес будет помещен в вывод. (Очевидно, если нет более конкретного обработчика вывода.)
void* px = NULL;
const char* ps = "Test";
FooType* pf = ...;
stringstream s;
s << ps << " " << px << " " << pf "\n";
s.str(); // yields, for example: "Test 0 AF120089"
Это может быть проблемой, если пользователь по ошибке пытался напечатать значение FooType.
И это также проблема при смешивании широкого и узкого символов, потому что вместо ошибки компилятора вы получите адрес напечатанный:
const wchar_t* str = L"Test! (Wide)";
// ...
cout << str << "\n"; // Ooops! Prints address of str.
Так что мне было интересно - поскольку я очень редко хочу выводить значение указателя , можно ли было бы отключить форматирование значений указателя, чтобы вставка значения указателя в поток приводила к ошибке компилятора? (Вывод значений указателя может быть легко достигнут с помощью типа оболочки или приведение значений указателя к size_t или чему-то подобному.)
Изменить: В свете ответа Нила (отключение вывода void * путем предоставления моего собственного оператора вывода void *) я хотел бы добавить, что было бы неплохо, если бы это также работало для таких инструментов, как Boost.Format, которые неявно используют оператор вывода, определенный в пространстве имен std
...