С ++, учебник для начинающих, 5 изд. Написание конструктора перемещения для класса String - PullRequest
1 голос
/ 24 февраля 2020

У меня есть это упражнение из C ++ primer 5 ed. Он просит добавить конструктор перемещения и оператор присваивания для моего класса String.

  • String имеет указатели на символ (char*). Это выглядит так:

    class String
    {
      public:
        String(String&&) noexcept; // move constructor
        String& operator=(String&&) noexcept;// move assignment operator
    
      private:
        iterator beg_; //using iterator = char*;
        iterator end_; 
        iterator off_cap_;
        alloc alloc_; // using alloc_ = std::allocator<char>
    
    };
    

Теперь в файле реализации я определил move-ctor следующим образом:

// move constructor
String::String(String&& rhs) noexcept :
    beg_(rhs.beg_), // or beg_(std::move(rhs.beg_))?
    end_(rhs.end_),
    off_cap_(rhs.off_cap_),
    alloc_(rhs.alloc_)// or alloc_(std::move(rhs.alloc_))?
{
    std::cout << "String move-ctor\n";
    rhs.beg_ = rhs.end_ = rhs.off_cap_ = nullptr; // putting objects in a destructible valid state
        // alloc_
}
  • Итак я должен использовать std::move на этих участниках или напрямую? потому что они встроенные указатели на char? - Два случая дают мне ожидаемые результаты.

  • Должен ли я переместить распределитель alloc_? если да, то как? а что будет с аллектором от переезда? и как я могу привести в разрушаемое действительное состояние?

  • Извините за столь много вопросов. Спасибо за ваши усилия и время.

PS: Пожалуйста, не спрашивайте меня о нарушении правила 3, 5 и 6, потому что для удобства чтения и краткости я не скопировал его с мой источник.

...