Как я могу использовать 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;
    });
}

живу на Coliru

на горки by Говард Объектов (основной вклад в семантику перемещения в C++11) очень полезно, а также пункт 17: понять специальные функции-члены поколения С Эффективный Современный C++ Скотт Мейерс.