Копирование и подстановка не рекомендуется?

В течение долгого времени я думал, что правильным способом реализации назначения копирования (для нетривиального класса) было использование идиомы copy-swap.

struct A{
   ... pointer to data
   A(A const& other){
       ... complicated stuff, allocation, loops, etc
   }
   void swap(A& other){... cheap stuff ...}
   A& operator=(A const& other){
      A tmp{other};
      swap(other);
      return *this;
   }
};

Но потом я услышал этот доклад https://www.youtube.com/watch?v=vLinb2fgkHk от Говарда Хиннанта, где он говорит, что идиома "подкачка копии" хороша для выполнения гарантии сильного исключения, но в целом это перебор.

Он упоминает это здесь: https://youtu.be/vLinb2fgkHk?t=2616

Поэтому он предлагает реализовать назначение копирования явно и иметь отдельную функцию strong_assing(A& target, A const& source) содержащий копию подкачки.

Что я не понимаю, так это как A& operator=(A const& other) должен быть реализован тогда?

Он предлагает иметь что-то подобное?

   A& operator=(A const& other){
        ... don't allocate if not necessary
        ... loop element by element
        ... clean the bare minimum if there is a throw 
   }

Это что std::vector реализации делают тогда? То есть они не используют идиому копирования-обмена в конце? Разве стандартный вектор не требует гарантии строгого исключения?

0 ответов

Другие вопросы по тегам