У меня есть следующий код:
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;
}
Я пытаюсь понять, почему работает №1, хотя при попытке использовать перегруженный оператор конкатенации, как в № 2, который завершается неудачно со следующей ошибкой (gcc 4.5.3 в MacOSX):
ошибка: невозможно связать lvalue для 'std :: basic_ostream' '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 : ошибка: инициализация аргумента 1 из 'std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> &&, const _Tp &) [с _CharT = char, _Traits = std :: char_traits, _Tp = simple] '
Вместо этого все будет хорошо, если я определю свой оператор как
std::ostream &operator << (std::ostream &f, const simple &obj)
{ ... }
Звучит как что-то, связанное с разрешением перегрузки, когда что-то вставлено в исходящий поток, для которого уже предусмотрена перегрузка ( const char * "label" в этом случае) распадается после разрешения перегрузки, но я не могу понять, что именно здесь происходит. Я хотел бы получить четкое представление о том, что пытается сделать компилятор ..