如果您将任何指针传递给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"
Run Code Online (Sandbox Code Playgroud)
如果用户错误地尝试实际打印FooType 的值,则这可能是个问题.
当混合使用宽字符和窄字符时,它也是一个问题,因为您将获得打印的地址而不是编译器错误:
const wchar_t* str = L"Test! (Wide)";
// ...
cout << str << "\n"; // Ooops! Prints address of str.
Run Code Online (Sandbox Code Playgroud)
所以我想知道 - 因为我很少想输出指针值,是否可以禁用指针值的格式化,以便将指针值插入流中会导致编译器错误?(然后可以通过使用包装器类型或将指针值强制转换为size_t或某些东西来轻松实现指针值的输出.)
编辑:根据Neil的答案(通过提供我自己的void*输出操作符来禁用void*输出)我想补充一点,如果这对于Boost.Format这样的工具也有用,那会隐式使用输出在std
命名空间中定义的运算符