Ну, я не знаю спецификацию C ++, которая вызывает это, но легко выяснить, почему это происходит.
Временная жизнь в стеке, обычно передаваемая другой функции или вызывающая одну операцию над ней. Итак, если вы позвоните на него свободному оператору:
оператор << (myostream (соиЬ)) </p>
Он уничтожается в конце этой операции, и второй оператор «<<» для добавления конца указывает на недопустимый объект. Возвращаемое значение из свободного оператора «<<» будет ссылкой на разрушенный временный объект. Спецификация C ++, вероятно, определяет правила для свободных операторов, чтобы этот сценарий не расстраивал и не сбивал с толку программистов C ++. </p>
Теперь, в случае оператора-члена «<< (void *)» для временного объекта, возвращаемое значение - это сам объект, который все еще находится в стеке и не уничтожен, поэтому компилятор знает, что его не следует уничтожать но передать его следующему оператору-члену, который принимает endl. Цепочка операторов для временных переменных является полезной функцией для сжатого кода C ++, поэтому я уверен, что разработчики спецификаций C ++ рассмотрели это и реализовали компилятор для его преднамеренной поддержки. </p>
1012 * редактировать *
Некоторые говорили, что это связано с неконстантной ссылкой. Этот код компилируется:
#include <iostream>
using namespace std;
class myostream : public ostream {
public:
myostream(ostream const &other) :
ostream(other.rdbuf())
{ }
~myostream() { cout << " destructing "; }
};
int _tmain(int argc, _TCHAR* argv[])
{
basic_ostream<char>& result = std::operator << (myostream(cout), "This works");
std::operator << (result, "illegal");
return 0;
}
И он возвращается
This works destructing illegal