2015-12-31 2 views
10

Я пытаюсь сортировать вектор, содержащий объекты, которые не являются конструктивными или по умолчанию конструктивными (но являются конструктивными), но я получаю ошибки в том, что компилятор не может найти действительную функцию для swap. Я думал, что достаточно иметь конструктор движений. Что мне здесь не хватает?Как я могу использовать std :: sort с объектами, у которых нет конструктора копирования?

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; 
    }); 
} 

ответ

20

Вам необходимо явно определить move assignment operator, так как это то, что std::sort также пытается (не только перемещать конструкцию). Обратите внимание, что генерация компилятора оператора присваивания перемещения is prohibited благодаря наличию предоставленного пользователем конструктора копирования, а также наличию предоставленного пользователем конструктора перемещения (даже если они являются 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; 
    }); 
} 

Live on Coliru

slides по Howard Hinnant (основному источнику для перемещения семантики в C++ 11) супер полезно, а также Пункт 17: Понимание специального поколения функции-члена от Effective Modern C++ Скоттом Мейерсом.

+2

В соответствии с cppreference, 'std :: sort' требует, чтобы тип был перемещаемым конструктивным * и * move assignable. – chris

+0

@chris Да, я разъяснил ответ, спасибо. – vsoftco

+1

Пятно на. Элементы не могут быть перемещены, потому что все они уже существуют; они должны перемещаться _assigned_, чтобы менять свои значения. –