Пользовательский компаратор стабильной сортировки с использованием передачи по ссылке с lamdas дает ошибку компиляции - PullRequest
0 голосов
/ 03 августа 2020

https://leetcode.com/problems/move-zeroes/ решал этот вопрос. Но это не компилируется.

void moveZeroes(vector<int>& nums) {
    

    stable_sort(nums.begin(), nums.end(),[](int& a, int& b){
            if(a == 0 && b != 0){
                return false;
            }
            if(a != 0 && b == 0){
                return true;
            }
            else {return false;}
        });
    }

Однако, если мы используем передачу по значению, равному (int a, int b), он компилируется. В чем основная проблема ??

1 Ответ

4 голосов
/ 03 августа 2020

Лямбда может принимать свои аргументы как ссылки. Проблема в том, что в вашем примере они не являются const-ref, а std::stable_sort передает значения const,

comp

  • [...] Подпись Функция сравнения должна быть эквивалентна следующему:

    bool cmp(const Type1 &a, const Type2 &b);
    

    Хотя подпись не обязательно должна иметь const &, , функция не должна изменять переданные ей объекты и должна иметь возможность принимать все значения типа (возможно const) Type1 и Type2 независимо от категории значения (таким образом, Type1 & не допускается , равно как и Type1, если для Type1 перемещение не эквивалентно копированию (начиная с C ++ 11)).

, который нельзя преобразовать в неконстантную ссылку. Просто объявите лямбда, чтобы взамен const int&:

stable_sort(nums.begin(), nums.end(),[](const int& a, const int& b) {
    // ...
  });

Ошибка компилятора - мертвая распродажа (имя файла для краткости усечено):

bits/predefined_ops.h:177:11: error: no match for call to ‘(moveZeroes(std::vector<int>&)::<lambda(int&, int&)>) (int&, const int&)’
  177 |  { return bool(_M_comp(*__it, __val)); }
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
bits/predefined_ops.h:177:11: note: candidate: ‘bool (*)(int&, int&)’ <conversion>
bits/predefined_ops.h:177:11: note:   conversion of argument 3 would be ill-formed:
bits/predefined_ops.h:177:11: error: binding reference of type ‘int&’ to ‘const int’ discards qualifiers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...