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