我检查了一块现有的代码,发现当用Visual C++ 9和MinGW编译它的行为是不同的:比较性病的地址:: ENDL
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<<()
以从流中剥离末端。
我发现,为什么它的行为有所不同:测试p_manip == static_cast...
使用MinGW成功,而失败的Visual C++ 9
- MinGW的“忽略”的演员和返回
std::endl
真实地址; - Visual C++ 9实际上将指针转换为endl并返回不同的地址。
我将测试更改为if (p_manip == std::endl)
,现在它的行为如预期。
我的问题是:这样一个复杂(事实上,错误)测试背后的基本原理是什么?
对于completness的缘故:
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&));
};
您的源代码控制何时说测试已写入?这可能是那个时候运算符==()不适用于这些类型。 – Bill 2010-02-23 16:19:55