首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std的比较地址::endl

std的比较地址::endl
EN

Stack Overflow用户
提问于 2010-02-23 15:54:53
回答 2查看 571关注 0票数 1

我正在检查一段现有代码,发现在用VisualC++9和MinGW编译时,它的行为有所不同:

代码语言:javascript
复制
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中成功,而在VisualC++ 9中失败。

std::endl;

  • Visual

  • MinGW“忽略”转换,并返回实际的C++ 9的实际地址,并返回一个不同的地址。

我将测试更改为if ( p_manip == std::endl ),现在它的行为与预期的一样。

我的问题是:这么一个复杂的(事实上,也是错误的)测试背后的理由是什么?

为了完整:

代码语言:javascript
复制
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&) );
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-02 14:47:23

供参考:

语句if ( p_manip == std::endl )没有在原始编译器上编译(gcc 3.4.5,最初开发代码的编译器)。

这意味着,正如我在问题中所说的那样,这次考试并没有错。

票数 0
EN

Stack Overflow用户

发布于 2010-02-23 16:03:26

猜测一下,我会说最初的作者没有意识到它们是兼容的类型,并且在规范上进行了转换(没有编译器要求他)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2319544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档