Pregunta

Estoy inspeccionando un pedazo de código existente y descubrió que se comporta de forma diferente cuando se compila con Visual C ++ 9 y 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;
}

Como el nombre sugiere, este es una clase de registro y se sobrecarga operator<<() a endls tira de la corriente.

descubrí por qué se comporta de manera diferente:. p_manip == static_cast... la prueba tiene éxito con MinGW, mientras que se produce un error con Visual C ++ 9

  • MinGW "ignora" el reparto y devuelve la dirección real de std::endl;
  • Visual C ++ 9 realidad arroja el endl puntero a y devuelve una dirección diferente.

Me cambió la prueba a if ( p_manip == std::endl ) y ahora se comporta como se esperaba.

Mi pregunta es: :? ¿Cuál es la razón de ser de un diseño complicado (y, como cuestión de hecho, mal) de prueba


En aras de la completitud:

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&) );
};
¿Fue útil?

Solución 2

Para más información:

El if ( p_manip == std::endl ) declaración no se compila en el compilador original (gcc 3.4.5, el compilador en el que se desarrolló originalmente el código).

Esto significa que la prueba no era malo como dije en mi pregunta.

Otros consejos

En una conjetura, diría que el autor original no se dio cuenta que eran tipos compatibles, e hicieron la conversión dirigieran (sin el compilador que le obligaba a).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top