У меня есть очень простой пример класса, скомпилированный с C ++ 17.
#include <string>
#include <iostream>
struct name {
std::string first, middle, last;
name() = default;
name(name const&) = default;
name(name &&) = default;
name& operator=(name o) {
std::swap(*this, o); // bad!
return *this;
}
};
int main() {
name n1{"mr", "john", "smith"};
name n2 = std::move(n1);
name n3 = n2;
std::cout << n3.first << " " << n3.middle << " " << n3.last;
}
Используя эту семантику значений, связанное назначение перемещения и я намеренно назвал квалифицированный своп вместо using std::swap; swap(*this, o);
.Я не предоставил свой своп в любом случае.Думая, что STL реализует обмен как конструкцию перемещения и серию назначений перемещений, я подумал, что эта реализация будет бесконечно рекурсивно заменять перемещение вызова и замену перемещения вызова.std::swap
заменен на членский обмен или что-то в этом роде?