Problem mit "Nur beweglichen Typen" in VC ++ 2010
Ich habe kürzlich Visual Studio 2010 Professional RC installiert, um es auszuprobieren und die wenigen C ++ 0x-Funktionen zu testen, die in VC ++ 2010 implementiert sind.
Ich instanziierte einstd::vector
vonstd::unique_ptr
, ohne Probleme. Wenn ich jedoch versuche, es zu füllen, indem ich temporäre Werte an @ übergepush_back
, der Compiler beschwert sich, dass der Kopierkonstruktor vonunique_ptr
ist privat. Ich habe versucht, einen Wert einzufügen, indem ich ihn verschiebe, und es funktioniert einwandfrei.
#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
}
Wie sich herausstellt, ist das Problem wederunique_ptr
Nochvector::push_back
aber die Art und Weise, wie VC ++ Überladungen beim Umgang mit rWerten auflöst, wird durch den folgenden Code veranschaulicht:
struct MoveOnly
{
MoveOnly() {}
MoveOnly(MoveOnly && other) {}
private:
MoveOnly(const MoveOnly & other);
};
void acceptRValue(MoveOnly && mo) {}
int main()
{
acceptRValue(MoveOnly()); // Compiler error
}
Der Compiler beschwert sich, dass der Kopierkonstruktor nicht erreichbar ist. Wenn ich es öffentlich mache, kompiliert das Programm (obwohl der Kopierkonstruktor nicht definiert ist).
Habe ich etwas über rvalue-Referenzen falsch verstanden oder ist es ein (möglicherweise bekannter) Fehler in der Implementierung dieser Funktion in VC ++ 2010?