Рассмотрим следующий код:
#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?