Я недавно прочитал (и, к сожалению, забыл где), что лучший способ, чтобы написать оператор = как это:явный конструктор копирования или неявный параметр по значению
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
вместо этого:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
Идея состоит в том, что если оператор = вызывается с rvalue, первая версия может оптимизировать построение копии. Поэтому, когда вызывается с rvalue, первая версия выполняется быстрее, а при вызове с lvalue два эквивалентны.
Мне любопытно, что другие люди думают об этом? Неужели люди избегут первой версии из-за отсутствия ясности? Правильно ли, что первая версия может быть лучше и никогда не может быть хуже?
Что такое 'swap'? Если это 'foo temp = x; х = у; y = temp; 'у вас есть infinte рекурсия функции' operator = 'и' swap'. –
Я написал программу для проверки теории @ Алексея Малистова, и он был прав - я получил бесконечную рекурсию. – nobar
Любой класс, который реализует идиому копирования и подкачки, не может полагаться на реализацию 'std :: swap' по умолчанию в своем операторе присваивания копий. Это почти само собой разумеется. –