Question

Je suis inspectais un morceau de code existant et a trouvé qu'il se comporte différemment lorsqu'il est compilé avec Visual C ++ 9 et 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;
}

Comme son nom l'indique, il est une classe de journal et surchargeant operator<<() à bande endls du flux.

J'ai découvert pourquoi il se comporte différemment:. Le p_manip == static_cast... test réussit avec MinGW alors qu'il échoue avec Visual C ++ 9

  • MinGW "ignore" la distribution et renvoie l'adresse réelle de std::endl;
  • Visual C ++ 9 fait le pointeur jette à endl et renvoie une autre adresse.

J'ai changé le test if ( p_manip == std::endl ) et maintenant il se comporte comme prévu.

Ma question est : quelle est la raison d'être d'un tel complexe (et, en fait, mauvais) test

?

Par souci de complétude:

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&) );
};
Était-ce utile?

La solution 2

Pour plus d'informations:

La déclaration if ( p_manip == std::endl ) ne compile pas sur le compilateur d'origine (gcc 3.4.5, le compilateur sur lequel le code a été développé à l'origine).

Cela signifie que le test n'a pas tort comme je l'ai dit dans ma question.

Autres conseils

Lors d'une supposition, je dirais que l'auteur original ne se rendent pas compte qu'ils étaient des types compatibles, et fait la conversion sur les spécifications (sans le compilateur l'obligeant à).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top