C++11/VS2010 :Возврат контейнеров некопируемых, но перемещаемых объектов

Рассмотрим следующий код:

#include <vector>
#include <boost/noncopyable.hpp>

struct A : private boost::noncopyable
{
  A(int num, const std::string& name)
    : num(num),
      name(name)
  {
  }

  A(A&& other)
    : num(other.num),
      name(std::move(other.name))
  {
  }

  int num;
  std::string name;
};

std::vector<A> getVec()
{
  std::vector<A> vec;
  vec.emplace_back(A(3, "foo"));
  // vec.emplace_back(3, "foo"); not available yet in VS10?

  return vec; // error, copy ctor inaccessible
}

int main ( int argc, char* argv[] )
{
  // should call std::vector::vector(std::vector&& other)
  std::vector<A> vec = getVec();

  return 0;
}

Это не компилируется в VS2010, потому что очевидно A— это noncopyableи, следовательно, std::vector<A>нельзя скопировать. Соответственно, я не могу вернуть std::vector<A>из функции.

Однако мне кажется неправильным, что такого рода вещи невозможны, учитывая концепцию RVO. Если бы здесь была применена оптимизация возвращаемого значения, создание копии можно было бы опустить, и вызов getVec()был бы действительным.

Так как же правильно это сделать? Возможно ли это вообще в VS2010/С++ 11?

6
задан ildjarn 23 July 2012 в 18:19
поделиться