У меня есть это упражнение из 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, потому что для удобства чтения и краткости я не скопировал его с мой источник.