std :: sort класс, который реализовал конструктор перемещения - PullRequest
0 голосов
/ 08 мая 2018

Можно ли использовать std :: sort без использования всего элемента?

std::vector<std::pair<int, myclass> > unsorted_vec;
for (some_iterations) {
    unsorted_vec.emplace_back(rand(), std::move(instance_of_myclass));
}
std::sort(unsorted_vec.begin(), unsorted_vec.end(), 
          [](auto & l, auto & r) { return l.first < r.first; });

Приведенный выше код выдает следующую ошибку компиляции, если строка std::sort не закомментирована.

error: use of deleted function 'myclass & myclass::operator=(const myclass &)' is 
       implicitly declared as delete because 'myclass' declares a move constructor.

Теперь я объявил конструктор перемещения для myclass, и, кроме того, я действительно хочу удалить ссылочный конструктор. У меня вопрос, как мне отсортировать этот массив? Можно ли получить ссылку на первую часть моей пары, не касаясь второй части?

1 Ответ

0 голосов
/ 08 мая 2018

Согласно этой ссылке на std :: sort ваш класс должен быть с возможностью создания и с возможностью назначения для того, чтобы мог сортироваться .

Если ваш класс по своей природе не moveble , то что-то вроде этого должно работать нормально:

class myclass
{
public:
    myclass(myclass const&) = delete; // or implement
    myclass(myclass&& other) { /* stuff to construct*/ }

    myclass& operator=(myclass const&) = delete; // or implement
    myclass& operator=(myclass&& other) { /* stuff to assign*/ return *this; }

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...