Рассмотрим следующий минимальный пример:
#include <iostream>
using namespace std;
class myostream : public ostream {
public:
myostream(ostream const &other) :
ostream(other.rdbuf())
{ }
};
int main() {
cout << "hello world" << endl;
myostream s(cout);
s << "hello world" << endl;
myostream(cout) << "hello world" << endl;
}
Вывод, как на g++, так и на Visual С++,
hello world
hello world
0x4012a4
Версия, которая записывает временный объект myostream(cout)
, предпочитает оператор-член ostream::operator<<(void *)
вместо свободного оператора operator<<(ostream &, char *)
. Кажется, имеет значение, имеет ли объект имя.
Почему это происходит? И как я могу предотвратить это поведение?
Изменить. Почему это происходит, теперь ясно из разных ответов. Что касается предотвращения этого, кажется привлекательным следующее:
class myostream : public ostream {
public:
// ...
myostream &operator<<(char const *str) {
std::operator<<(*this, str);
return *this;
}
};
Однако это приводит к разным неоднозначностям.