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

В течение долгого времени я думал, что правильным способом реализации назначения копирования (для нетривиального класса) было использование идиомы 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 реализации делают тогда?
То есть они не используют идиому копирования-обмена в конце?
Разве стандартный вектор не требует гарантии строгого исключения?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector