我正在检查一段现有代码,发现在使用Visual C ++ 9和MinGW编译时它的行为有所不同:
inline LogMsg& LogMsg::operator<<(std::ostream& (*p_manip)(std::ostream&) )
{
if ( p_manip == static_cast< std::ostream& (*)(std::ostream&) > ( &std::endl<char, std::char_traits<char> >) )
{
msg(m_output.str());
m_output.str( "" );
}
else
{
(*p_manip) (m_output); // or // output << p_manip;
}
return *this;
}
顾名思义,这是一个日志类,它会重载operator<<()
以从流中删除endls。
我发现了它的行为方式不同:测试p_manip == static_cast...
使用MinGW成功,而使用Visual C ++ 9失败。
std::endl
; 我将测试更改为if ( p_manip == std::endl )
,现在它的行为符合预期。
我的问题是:这种复杂(实际上是错误的)测试背后的理由是什么?
为了完整性:
class LogStream
{
public:
LogStream() {}
protected:
std::ostringstream m_output;
};
class LogMsg : public LogStream
{
friend LogMsg& msg() ;
static LogMsg s_stream;
public:
LogMsg() {}
template <typename T>
inline LogMsg& operator<<(T p_data);
inline LogMsg& operator<<(std::ostream& (*p_manip)(std::ostream&) );
};
答案 0 :(得分:0)
猜测一下,我会说原作者没有意识到它们是兼容的类型,并且在规范上做了转换(没有编译器要求他)。
答案 1 :(得分:0)
有关信息:
语句if ( p_manip == std::endl )
不能在原始编译器上编译(gcc 3.4.5,最初开发代码的编译器)。
这意味着测试没有错,正如我在问题中所述。