operador sobrecarregado << em problemas de concatenação ofstream

Eu tenho o seguinte 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;
}

Estou tentando entender por que o nº 1 funciona, enquanto há problemas ao tentar usar o operador sobrecarregado concatenando-o como no nº 2, que falha com o seguinte erro (gcc 4.5.3 no MacOSX):

erro: não é possível vincular o lvalue '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: erro: inicializando o argumento 1 do 'std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> &&, const _Tp &) [com _CharT = char, _Traits = std :: char_traits, _Tp = simple] '

Tudo está bem se eu definir meu operador como

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

Parece algo relacionado à resolução de sobrecarga, onde ter algo inserido no ofstream para o qual já existe uma sobrecarga fornecida (o const char * "label" nesse caso) termina após a resolução de sobrecarga, mas não consigo entender exatamente o que exatamente está acontecendo aqui. Eu gostaria de ter uma ideia clara do que o compilador está tentando fazer.

questionAnswers(1)

yourAnswerToTheQuestion