4

私は次のクラスを持っています:

class Student
{
private:
    std::string firstName;
    std::string lastName;
public:
    Student():firstName(""), lastName("") 
    { 
    }

    Student(const std::string &first, const std::string &last)
        :firstName(first), lastName(last) 
    {
    }

    Student(const Student &student)
        :firstName(student.firstName), lastName(student.lastName)
    {
    }

    Student(Student &&student)
    {
        firstName=std::move(student.firstName);
        lastName=std::move(student.lastName);
    }

    // ... getters and setters    
};

私はそれを次のように使用します:

std::vector<std::shared_ptr<Student>> students;
std::shared_ptr<Student> stud1 = std::make_shared<Student>("fn1","ln1");
students.push_back(stud1);
Student stud2("fn2","ln2");
students.push_back(std::make_shared<Student>(std::move(stud2)));

私が読んだことから、moveコンストラクターはコンパイラーによって自動的に生成されます。今、この行に足を踏み入れるstudents.push_back(std::make_shared<Student>(std::move(stud2)));と、moveコンストラクターに到達します。これで問題ありません。

その行に足を踏み入れたときにmoveコンストラクターをコメントアウトすると、copyコンストラクターに到達します。なぜこれが起こっているのか分かりません。

4

2 に答える 2

3

Visual C++ 2012 は、ムーブ コンストラクターまたはムーブ代入演算子を暗黙的に生成しません。

(移動操作が暗黙的に宣言および定義される場合とされない場合を管理するルールは、標準化中に何度か変更されました。Visual C++ 2012 は、標準化された (2011) ルール セットをサポートしていません。)

于 2013-01-21T02:59:20.763 に答える
1

あなたの場合、これらすべてのコンストラクターを簡単に宣言できます=default

class student
{
  std::string firstname, surname;
public:
  student(student const&) = default;
  student(student&&) = default;
  student&operator=(student const&) = default;
  student&operator=(student&&) = default;
  // etc
};

詳細については気にしないでください。コンパイラはこれを整理し、std::string::string(string&&)(moveコンストラクタ)への適切な呼び出しを生成する必要があります。

編集もちろん、これは不十分なコンパイラでは機能しませんが、「C ++ 11」にタグを付けている場合は、C++11の答えを期待する必要があります。

于 2013-01-20T17:47:22.670 に答える