Как я могу использовать std:: sort с объектами, у которых нет конструктора копирования?
Я пытаюсь отсортировать вектор, содержащий объекты, которые не копируют конструктивные или конструктивные по умолчанию (но перемещаются конструктивные), но я получаю ошибки о том, что компилятор не может найти допустимую функцию для swap
. Я думал, что наличие конструктора move будет достаточно. Я что-то упускаю?
class MyType {
public:
MyType(bool a) {}
MyType(const MyType& that) = delete;
MyType(MyType&& that) = default;
};
int main(void) {
vector<MyType> v;
v.emplace_back(true);
sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) {
return true;
});
}
1 ответов
вам нужно явно определить двигаться оператор присваивания, а это std::sort
также пытается (не только ход строительства). Обратите внимание, что компилятор-генерация оператора назначения перемещения запрещен наличием предоставленного пользователем конструктора копирования, а также наличием предоставленного пользователем конструктора перемещения (даже если они delete
- ed). Пример:
#include <vector>
#include <algorithm>
class MyType {
public:
MyType(bool a) {}
MyType(const MyType& that) = delete;
MyType(MyType&& that) = default;
MyType& operator=(MyType&&) = default; // need this, adapt to your own need
};
int main(void) {
std::vector<MyType> v;
v.emplace_back(true);
std::sort(v.begin(), v.end(), [](MyType const& l, MyType const& r) {
return true;
});
}
на горки by Говард Объектов (основной вклад в семантику перемещения в C++11) очень полезно, а также пункт 17: понять специальные функции-члены поколения С Эффективный Современный C++ Скотт Мейерс.