Problema com “tipos móveis somente” no VC ++ 2010
Instalei recentemente o Visual Studio 2010 Professional RC para testá-lo e testar os poucos recursos do C ++ 0x implementados no VC ++ 2010.
Instanciei umstd::vector
dostd::unique_ptr
, sem quaisquer problemas. No entanto, quando tento preenchê-lo, passe temporários parapush_back
, o compilador reclama que o construtor de cópias deunique_ptr
é privado. Tentei inserir um lvalue movendo-o e funciona muito bem.
#include <utility>
#include <vector>
int main()
{
typedef std::unique_ptr<int> int_ptr;
int_ptr pi(new int(1));
std::vector<int_ptr> vec;
vec.push_back(std::move(pi)); // OK
vec.push_back(int_ptr(new int(2))); // compiler error
}
Como se vê, o problema não é nemunique_ptr
nemvector::push_back
mas a maneira como o VC ++ resolve sobrecargas ao lidar com rvalues, conforme demonstrado pelo seguinte código:
struct MoveOnly
{
MoveOnly() {}
MoveOnly(MoveOnly && other) {}
private:
MoveOnly(const MoveOnly & other);
};
void acceptRValue(MoveOnly && mo) {}
int main()
{
acceptRValue(MoveOnly()); // Compiler error
}
O compilador reclama que o construtor de cópias não está acessível. Se eu o tornar público, o programa será compilado (mesmo que o construtor de cópias não esteja definido).
Eu entendi mal algo sobre referências a rvalue ou é um bug (possivelmente conhecido) na implementação desse recurso no VC ++ 2010?