operador sobrecargado << en problemas de concatenación de corriente

Tengo el siguiente código:

struct simple
{
    simple (int a1, int a2) : member1(a1), member2(a2) {}
    int member1;
    int member2;
};

std::ofstream &operator << (std::ofstream &f, const simple &obj)
{
    f<<obj.member1<<", "<<obj.member2;
    return f;
} 
int main(int argc, const char *argv[])
{
    std::ofstream f("streamout.txt");

    simple s(7,5);
    f << s;               //#1 This works
    f << "label: " << s;  //#2 This fails

    return 0;
}

Estoy tratando de entender por qué funciona el n. ° 1, mientras que hay problemas al intentar usar el operador sobrecargado que lo concatena como en el n. ° 2 que falla con el siguiente error (gcc 4.5.3 en MacOSX):

error: no se puede enlazar el valor 'std :: basic_ostream' a 'std :: basic_ostream &&' /GCC-FACTORY/4.5/INSTALL/lib/gcc/x86_64-apple-darwin10.5.0/4.5.3/../../. ./../include/c++/4.5.3/ostream:579:5: error: inicializando argumento 1 de 'std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> &&, const _Tp &) [con _CharT = char, _Traits = std :: char_traits, _Tp = simple] '

En cambio, todo está bien si defino mi operador como

std::ostream &operator << (std::ostream &f, const simple &obj)
{ ... }

Suena como algo relacionado con la resolución de sobrecarga, donde tener un elemento insertado en la corriente para la que ya hay una sobrecarga proporcionada (la "etiqueta" const char * en este caso) se rompe después de la resolución de sobrecarga, pero realmente no puedo entender exactamente qué está pasando aquí Me gustaría tener una idea clara de lo que el compilador intenta hacer ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta