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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage