2014-07-04 9 views
18

Ich las Bewegung Konstruktor in Bezug auf, und ich habe diesen Code in VS 2013 ...Verschieben Constructor - ungültiger Typ für notleidende Konstruktor VS 2013

class Student 
{ 
    unique_ptr<string> pName_; 

public: 
    Student(string name) : pName_(new string(name)) { } 
    ~Student() { } 
    Student(Student&&) = default; // Here I get the error. 
    void printStudentName(void) { cout << *pName_ << endl; } 
}; 

int main(void) 
{ 
    vector<Student> persons; 

    Student p = Student("Nishith"); 
    persons.push_back(std::move(p)); 
    persons.front().printStudentName(); 

    return 0; 
} 

ich die "Student::Student(Student&&): ist kein spezielles Element Funktion, die kann voreingestellt werden "wenn ich es kompilieren wollte ...

Kann mir jemand erklären, warum ich diesen Fehler bekomme?

+0

Besser auch das C++ Basis-Tag hinzufügen. Wie auch immer, wissen Sie, dass die Verwendung der dynamischen Zuweisung für die Zeichenfolge eine vollständige Verschwendung ist? – Deduplicator

+0

Sie im Visual Studio gemeint, oder? – Deduplicator

+0

@Deduplicator: Okay, Punkt genommen. Ja, ich meinte Visual Studio 2013. – NJMR

Antwort

31

Da der VS2013-Compiler keine Standardmove-Konstruktoren unterstützt.

Siehe folgende Anmerkung from MSDN:

Visual Studio notleidenden bewegt Bauer oder move-Zuweisungsoperator, wie die C++ 11 Standard-Mandate nicht unterstützt. Weitere Informationen finden Sie im Abschnitt "Defaulted and Deleted" von Support For C++11 Features (Modern C++).

+3

Ich erwartete, dass ich auch MSDN durchsucht, aber nicht die richtige Verbindung gefunden ... Ja, defaulted und gelöschte Funktionen Abschnitt unter dem Link sagt, dass. Danke für die Antwort. – NJMR

+1

Diese Antwort ist irreführend. VS2013 _does_ generiert standardmäßig Move-Konstruktoren, jedoch können Move-Konstruktoren nicht voreingestellt werden. Sie sind verschiedene Dinge. –

+0

@MooingDuck Danke. Ich habe eine angemessene Bearbeitung vorgenommen. –