После быстрого изучения выясняется, что поддержка rvalue еще не добавлена в потоки.
Для того, чтобы действительно вернуть не копируемый объект из функции, достаточно реализовать конструктор перемещения следующим образом:
struct noncopyable
{
noncopyable()
{}
// move constructor
noncopyable(noncopyable &&)
{}
private:
noncopyable(const noncopyable &);
noncopyable &operator=(const noncopyable &);
};
Предполагается, что такой конструктор передает владение новому объекту, оставляя передаваемый в состоянии по умолчанию.
Тем не менее, можно вернуть объект из функции следующим образом:
noncopyable factory()
{
noncopyable abc;
return std::move(abc);
}
Хотя std :: stream не поддерживает конструкторы перемещения, похоже, что контейнеры STL, поставляемые с gcc 4.3.2, уже поддерживают его.