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