2010-02-23 38 views
1

我检查了一块现有的代码,发现当用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&)); 
}; 
+0

您的源代码控制何时说测试已写入?这可能是那个时候运算符==()不适用于这些类型。 – Bill 2010-02-23 16:19:55

回答

0

的信息:

if (p_manip == std::endl)不会对原来的编译器来编译语句(GCC 3.4.5,编译器上的代码最初被开发)。

这意味着测试没有错,正如我在我的问题中所述。

0

在猜测,我会说原作者没有意识到他们是兼容的类型,并做了规范的转换(不编译要求他)。