考虑一段通用 C++ 代码,它将其参数的值输出到流中,以防它们不相等:
#define LOG_IF_NE(a, b) if(a != b) { \
std::cerr << "Failed because (" << ##a << "=" << (a) << \
") != (" << ##b << "=" << (b) << ")"; \
}
这只是一个示例,实际代码在将消息写入字符串流后会引发异常。operator <<
对于定义的流,这适用于 2 个整数、2 个指针等。
int g_b;
int f(int a)
{
LOG_IF_NE(a, g_b);
// implementation follows
}
当参数之一LOG_IF_NE
是nullptr
:MSVC++2013 编译器给出error C2593: 'operator <<' is ambiguous
.
int *pA;
int g()
{
LOG_IF_NE(pA, nullptr);
}
问题的发生是因为nullptr
有一个特殊的类型,并且operator <<
没有在 STL 中为该类型定义。https://stackoverflow.com/a/21772973/1915854的答案建议定义operator <<
为std::nullptr_t
//cerr is of type std::ostream, and nullptr is of type std::nullptr_t
std::ostream& operator << (std::ostream& os, std::nullptr_t)
{
return os << "nullptr"; //whatever you want nullptr to show up as in the console
}
这是解决问题的正确方法吗?这不是 C++11/STL 中operator<<
未定义的错误nullptr_t
吗?在 C++14/17 中是否需要修复?或者它是故意的(因此一个人的私人定义operator<<
可能有一个陷阱)?