c++ - 比较 std::endl 的地址

标签 c++ function-pointers endl

我正在检查一段现有代码,发现它在使用 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 失败。

  • MinGW“忽略”转换并返回 std::endl 的真实地址;
  • Visual C++ 9 实际上转换指针到 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&) );
};

最佳答案

我猜,我会说原作者没有意识到它们是兼容的类型,并按照规范进行了转换(编译器没有要求他这样做)。

关于c++ - 比较 std::endl 的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2319544/

相关文章:

c++ - 如何防止数字出现在科学计数法中

c - 如何使用函数指针数组?

c++ - 如何为我的类(class)创建 endl 操纵器?

C++流作为重载运算符时的参数<<

c++ - 类定义中的双字符数组

python - 使用 CMake 构建与平台无关的目录结构

c++ - Max heapify 无限循环用于数组而不是 vector

c++ - C++中具有默认参数的函数指针

c++ - 在构造对象时定义成员函数

c++ - cout<<endl;不适用于打印二维数组